Bitonic Point Maximum in Increasing Decreasing Array (original) (raw)

Last Updated : 23 Jul, 2025

Given an array **arr[] of integers which is initially **strictly increasing and then **strictly decreasing, the task is to find the **bitonic point, that is the **maximum value in the array.

**Note: Bitonic Point is a point in bitonic sequence before which elements are strictly increasing and after which elements are strictly decreasing.

**Examples:

**Input: arr[] = [1, 2, 4, 5, 7, 8, 3]
**Output: 8
**Explanation: 8 is the maximum element in the array.

**Input: arr[] = [10, 20, 30, 40, 50]
**Output: 50
**Explanation: 50 is the maximum element in the array.

**Input: arr[] = [120, 100, 80, 20, 0]
**Output: 120
**Explanation: 120 is the maximum element in the array.

Try It Yourselfredirect icon

Table of Content

[Naive Approach] Using Linear Search - O(n) Time and O(1) Space

A simple approach is to traverse the array and keep track of maximum element. Finally return the maximum element.

C++ `

// C++ program to find bitonic point in an array // using linear search #include #include using namespace std;

// function to find the maximum element int findMaximum(vector& arr) { int mx = arr[0]; for (int i = 1; i < arr.size(); i++) {

      // update max when found greater value
    if (arr[i] > mx) 
        mx = arr[i]; 
    
    // break when once an element is smaller than 
    // the max then it will go on decreasing 
    // and no need to check after that 
    else
        break; 
} 
return mx; 

}

int main() { vector arr = {1, 2, 4, 5, 7, 8, 3}; cout << findMaximum(arr); return 0; }

C

// C program to find bitonic point in an array // using linear search

#include <stdio.h>

int findMaximum(int arr[], int n) { int mx = arr[0]; for (int i = 1; i < n; i++) {

    // update max when found greater value
    if (arr[i] > mx) 
        mx = arr[i]; 
    
    // break when once an element is smaller than 
    // the max then it will go on decreasing 
    // and no need to check after that 
    else
        break; 
} 
return mx; 

}

int main() { int arr[] = {1, 2, 4, 5, 7, 8, 3}; int n = sizeof(arr) / sizeof(arr[0]); printf("%d", findMaximum(arr, n)); return 0; }

Java

// Java program to find bitonic point in an array // using linear search

import java.util.*; class GfG {

// function to find the maximum element 
static int findMaximum(int[] arr) {
    int mx = arr[0]; 
    for (int i = 1; i < arr.length; i++) { 
      
        // update max when found greater value
        if (arr[i] > mx) 
            mx = arr[i]; 
        
        // break when once an element is smaller than 
        // the max then it will go on decreasing 
        // and no need to check after that 
        else
            break; 
    } 
    return mx; 
} 

public static void main(String[] args) {
    int[] arr = {1, 2, 4, 5, 7, 8, 3}; 
    System.out.println(findMaximum(arr)); 
}

}

Python

Python program to find bitonic point in an array

using linear search

function to find the maximum element

def findMaximum(arr): mx = arr[0] for i in range(1, len(arr)):

    # update max when found greater value
    if arr[i] > mx:
        mx = arr[i]
    
    # break when once an element is smaller than 
    # the max then it will go on decreasing 
    # and no need to check after that 
    else:
        break
return mx

if name == "main": arr = [1, 2, 4, 5, 7, 8, 3] print(findMaximum(arr))

C#

// C# program to find bitonic point in an array // using linear search

using System; using System.Collections.Generic;

class GfG {

// function to find the maximum element 
static int findMaximum(int[] arr) {
    int mx = arr[0];
    for (int i = 1; i < arr.Length; i++) {
        
        // update max when found greater value
        if (arr[i] > mx)
            mx = arr[i];
        
        // break when once an element is smaller than 
        // the max then it will go on decreasing 
        // and no need to check after that 
        else
            break;
    }
    return mx;
}

static void Main() {
    int[] arr = { 1, 2, 4, 5, 7, 8, 3 };
    Console.WriteLine(findMaximum(arr));
}

}

JavaScript

// JavaScript program to find bitonic point in an array // using linear search

// function to find the maximum element function findMaximum(arr) { let mx = arr[0]; for (let i = 1; i < arr.length; i++) {

    // update max when found greater value
    if (arr[i] > mx) 
        mx = arr[i];
    
    // break when once an element is smaller than 
    // the max then it will go on decreasing 
    // and no need to check after that 
    else
        break;
}
return mx;

}

let arr = [1, 2, 4, 5, 7, 8, 3]; console.log(findMaximum(arr));

`

[Expected Approach] Using **Binary Search - O(log n) Time and O(1) Space

We can optimize the maximum element searching by using Binary Search where we find the **mid element and then decide whether to stop or to go to left half or right half. How do we decide in this case.

C++ `

// C++ program to find bitonic point in an array // using Binary Search

#include #include using namespace std;

int findMaximum(vector &arr) { int n = arr.size();

// Check if the first element is maximum
if (n == 1 || arr[0] > arr[1])
    return arr[0];

// Check if the last element is maximum
if (arr[n - 1] > arr[n - 2])
    return arr[n - 1];

// Search Space for binary Search
int lo = 1, hi = n - 2;

while (lo <= hi) {
    int mid = lo + (hi - lo) / 2;

    // If the element at mid is maximum then return it
    if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
        return arr[mid];

    // If next element is greater, then maximum
    // element will exist in the right subarray
    if (arr[mid] < arr[mid + 1])
        lo = mid + 1;

    // Otherwise, it will exist in left subarray
    else
        hi = mid - 1;
}

return arr[hi];

}

int main() { vector arr = {1, 2, 4, 5, 7, 8, 3}; cout << findMaximum(arr); return 0; }

C

// C++ program to find bitonic point in an array // using Binary Search

#include <stdio.h>

int findMaximum(int arr[], int n) {

// Check if the first element is maximum
if (n == 1 || arr[0] > arr[1])
    return arr[0];

// Check if the last element is maximum
if (arr[n - 1] > arr[n - 2])
    return arr[n - 1];

// Search Space for binary Search
int lo = 1, hi = n - 2;

while (lo <= hi) {
    int mid = lo + (hi - lo) / 2;

    // If the element at mid is maximum then return it
    if (arr[mid] >= arr[mid - 1] && arr[mid] > arr[mid + 1])
        return arr[mid];

    // If next element is greater, then maximum
    // element will exist in the right subarray
    if (arr[mid] < arr[mid + 1])
        lo = mid + 1;

    // Otherwise, it will exist in left subarray
    else
        hi = mid - 1;
}

return arr[hi];

}

int main() { int arr[] = {1, 2, 4, 5, 7, 8, 3}; int n = sizeof(arr) / sizeof(arr[0]); printf("%d\n", findMaximum(arr, n)); return 0; }

Java

// Java Program to find bitonic point in an array // using Binary Search

import java.util.*;

class GfG { static int findMaximum(int[] arr) { int n = arr.length;

    // Check if the first element is maximum
    if (n == 1 || arr[0] > arr[1])
        return arr[0];

    // Check if the last element is maximum
    if (arr[n - 1] > arr[n - 2])
        return arr[n - 1];

    // Search Space for binary Search
    int lo = 1, hi = n - 2;

    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;

        // If the element at mid is maximum then return it
        if (arr[mid] >= arr[mid - 1] && arr[mid] > arr[mid + 1])
            return arr[mid];

        // If next element is greater, then maximum
        // element will exist in the right subarray
        if (arr[mid] < arr[mid + 1])
            lo = mid + 1;

        // Otherwise, it will exist in left subarray
        else
            hi = mid - 1;
    }

    return arr[hi];
}

public static void main(String[] args) {
    int[] arr = {1, 2, 4, 5, 7, 8, 3};
    System.out.println(findMaximum(arr));
}

}

Python

Python program to find bitonic point in an array

using Binary Search

def findMaximum(arr): n = len(arr)

# Check if the first element is maximum
if n == 1 or arr[0] > arr[1]:
    return arr[0]

# Check if the last element is maximum
if arr[n - 1] > arr[n - 2]:
    return arr[n - 1]

# Search Space for binary Search
lo, hi = 1, n - 2

while lo <= hi:
    mid = lo + (hi - lo) // 2

    # If the element at mid is maximum then return it
    if arr[mid] > arr[mid - 1] and arr[mid] > arr[mid + 1]:
        return arr[mid]

    # If next element is greater, then maximum
    # element will exist in the right subarray
    if arr[mid] < arr[mid + 1]:
        lo = mid + 1

    # Otherwise, it will exist in left subarray
    else:
        hi = mid - 1

return arr[hi]

if name == "main": arr = [1, 2, 4, 5, 7, 8, 3] print(findMaximum(arr))

C#

// C# program to find bitonic point in an array // using Binary Search

using System;

class GfG {

static int findMaximum(int[] arr) {
    int n = arr.Length;

    // Check if the first element is maximum
    if (n == 1 || arr[0] > arr[1])
        return arr[0];

    // Check if the last element is maximum
    if (arr[n - 1] > arr[n - 2])
        return arr[n - 1];

    // Search Space for binary Search
    int lo = 1, hi = n - 2;

    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;

        // If the element at mid is a
        // maximum element then return mid
        if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
            return arr[mid];

        // If next element is greater, then maximum
        // element will exist in the right subarray
        if (arr[mid] < arr[mid + 1])
            lo = mid + 1;

        // Otherwise, it will exist in left subarray
        else
            hi = mid - 1;
    }

    return arr[hi];
}

static void Main() {
    int[] arr = {1, 2, 4, 5, 7, 8, 3};
    Console.WriteLine(findMaximum(arr));
}

}

JavaScript

// JavaScript program to find bitonic point in an array // using Binary Search

function findMaximum(arr) { let n = arr.length;

// Check if the first element is maximum
if (n === 1 || arr[0] > arr[1]) 
    return arr[0];

// Check if the last element is maximum
if (arr[n - 1] > arr[n - 2]) 
    return arr[n - 1];

// Search Space for binary Search
let lo = 1, hi = n - 2;

while (lo <= hi) {
    let mid = lo + Math.floor((hi - lo) / 2);

    // If the element at mid is a
    // maximum element then return mid
    if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]) 
        return arr[mid];

    // If next element is greater, then maximum
    // element will exist in the right subarray
    if (arr[mid] < arr[mid + 1]) 
        lo = mid + 1;

    // Otherwise, it will exist in left subarray
    else 
        hi = mid - 1;
}

return arr[hi];

}

let arr = [1, 2, 4, 5, 7, 8, 3]; console.log(findMaximum(arr));

`