Find bitonic point in given bitonic sequence (original) (raw)

Last Updated : 11 Feb, 2025

You are given a **Bitonic Sequence, the task is to find **Bitonic Point in it. A Bitonic Sequence is a sequence of numbers which is first strictly **increasing then after a point strictly **decreasing.
A Bitonic Point is a point in bitonic sequence before which elements are strictly increasing and after which elements are strictly decreasing.
Note:- Given Sequence will always be a valid bitonic sequence.
**Examples:

**Input: arr[] = {8, 10, 100, 200, 400, 500, 3, 2, 1}
**Output: 500

**Input: arr[] = {10, 20, 30, 40, 30, 20}
**Output: 40

**Input: arr[] = {60, 70, 120, 100, 80}
**Output: 120

Table of Content

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

A simple approach is to iterate through the array and keep track of the **maximum element occurred so far. once the traversal is complete, return the maximum element.

C++ `

// C++ program to find maximum element in bitonic // array using linear search

#include #include using namespace std;

int bitonicPoint(vector &arr) { int res = arr[0];

// Traverse the array to find 
  // the maximum element
for (int i = 1; i < arr.size(); i++) 
     res = max(res, arr[i]);

return res; 

}

int main() { vector arr = {8, 10, 100, 400, 500, 3, 2, 1}; cout << bitonicPoint(arr); return 0; }

C

// C program to find maximum element in bitonic // array using linear search

#include <stdio.h>

int bitonicPoint(int arr[], int n) { int res = arr[0];

// Traverse the array to find 
// the maximum element
for (int i = 1; i < n; i++) 
    res = (res > arr[i]) ? res : arr[i];

return res;

}

int main() { int arr[] = {8, 10, 100, 400, 500, 3, 2, 1}; int n = sizeof(arr) / sizeof(arr[0]); printf("%d\n", bitonicPoint(arr, n)); return 0; }

Java

// Java program to find maximum element in bitonic // array using linear search

import java.util.Arrays;

class GfG { static int bitonicPoint(int[] arr) { int res = arr[0];

    // Traverse the array to find 
    // the maximum element
    for (int i = 1; i < arr.length; i++) 
        res = Math.max(res, arr[i]);

    return res;
}

public static void main(String[] args) {
    int[] arr = {8, 10, 100, 400, 500, 3, 2, 1};
    System.out.println(bitonicPoint(arr));
}

}

Python

Python program to find maximum element in

bitonic array using linear search

def bitonicPoint(arr): res = arr[0]

# Traverse the array to find 
# the maximum element
for i in range(1, len(arr)):
    res = max(res, arr[i])

return res

if name == "main": arr = [8, 10, 100, 400, 500, 3, 2, 1] print(bitonicPoint(arr))

C#

// C# program to find maximum element in bitonic // array using linear search

using System;

class GfG { static int bitonicPoint(int[] arr) { int res = arr[0];

    // Traverse the array to find 
    // the maximum element
    for (int i = 1; i < arr.Length; i++) 
        res = Math.Max(res, arr[i]);

    return res;
}

static void Main() {
    int[] arr = {8, 10, 100, 400, 500, 3, 2, 1};
    Console.WriteLine(bitonicPoint(arr));
}

}

JavaScript

// JavaScript program to find maximum element in // bitonic array using linear search

function bitonicPoint(arr) { let res = arr[0];

// Traverse the array to find 
// the maximum element
for (let i = 1; i < arr.length; i++) 
    res = Math.max(res, arr[i]);

return res;

}

const arr = [8, 10, 100, 400, 500, 3, 2, 1]; console.log(bitonicPoint(arr));

`

[Expected Approach] Using Binary Search - O(logn) Time and O(1) Space

The input array follows a monotonic pattern. If an element is smaller than the next one, it lies in the increasing segment** of the array, and the maximum element will definitely exist after it. Conversely, if an element is **greater than the next one, it lies in the **decreasing segment, meaning the maximum is either at this position or earlier. Therefore, we can use binary search to efficiently find the maximum element in the array.

C++ `

// C++ program to find the maximum element in a bitonic // array using binary search.

#include #include using namespace std;

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

// Search space for binary search.
int lo = 0, hi = n - 1;    
int res = n - 1;                 

while(lo <= hi) {
    int mid = (lo + hi) / 2; 
    
    // Decreasing segment
    if(mid + 1 < n && arr[mid] > arr[mid + 1]) {
        res = mid;            
        hi = mid - 1;  
    }
    
    // Increasing segment
    else {
        lo = mid + 1;       
    }
}
    
return arr[res];              

}

int main() { vector arr = {8, 10, 100, 400, 500, 3, 2, 1}; cout << bitonicPoint(arr); return 0; }

C

// C program to find the maximum element in a bitonic // array using binary search.

#include <stdio.h>

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

// Search space for binary search.
int lo = 0, hi = n - 1;    
int res = hi;                  

while(lo <= hi) {
    int mid = (lo + hi) / 2; 
    
    // Decreasing segment
    if(mid + 1 < n && arr[mid] > arr[mid + 1]) {
        res = mid;            
        hi = mid - 1;  
    }
    // Increasing segment
    else {
        lo = mid + 1;       
    }
}

return arr[res];              

}

int main() { int arr[] = {8, 10, 100, 400, 500, 3, 2, 1}; int n = sizeof(arr) / sizeof(arr[0]); printf("%d\n", bitonicPoint(arr, n)); return 0; }

Java

// Java program to find the maximum element in a bitonic // array using binary search.

import java.util.Arrays;

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

    // Search space for binary search.
    int lo = 0, hi = n - 1;    
    int res = n - 1;                  
    
    while (lo <= hi) {
        int mid = (lo + hi) / 2; 
        
        // Decreasing segment
        if (mid + 1 < n && arr[mid] > arr[mid + 1]) {
            res = mid;            
            hi = mid - 1;  
        }
        // Increasing segment
        else {
            lo = mid + 1;       
        }
    }
    
    return arr[res];              
}

public static void main(String[] args) {
    int[] arr = {8, 10, 100, 400, 500, 3, 2, 1}; 
    System.out.println(bitonicPoint(arr)); 
}

}

Python

Python program to find the maximum element in a bitonic

array using binary search.

def bitonicPoint(arr):

# Search space for binary search.
lo = 0
hi = len(arr) - 1    
res = hi                 

while lo <= hi:
    mid = (lo + hi) // 2 
    
    # Decreasing segment
    if mid + 1 < len(arr) and arr[mid] > arr[mid + 1]:
        res = mid            
        hi = mid - 1  
    # Increasing segment
    else:
        lo = mid + 1       
        
return arr[res]              

if name == "main": arr = [8, 10, 100, 400, 500, 3, 2, 1] print(bitonicPoint(arr))

C#

// C# program to find the maximum element in a bitonic // array using binary search.

using System;

class GfG { static int bitonicPoint(int[] arr) { int n = arr.Length;

    // Search space for binary search.
    int lo = 0, hi = n - 1;    
    int res = n - 1;                  
    
    while (lo <= hi) {
        int mid = (lo + hi) / 2; 
        
        // Decreasing segment
        if (mid + 1 < n && arr[mid] > arr[mid + 1]) {
            res = mid;            
            hi = mid - 1;  
        }
        // Increasing segment
        else {
            lo = mid + 1;       
        }
    }
    
    return arr[res];              
}

static void Main() {
    int[] arr = {8, 10, 100, 400, 500, 3, 2, 1}; 
    Console.WriteLine(bitonicPoint(arr)); 
}

}

JavaScript

// JavaScript program to find the maximum element in a bitonic // array using binary search.

function bitonicPoint(arr) { const n = arr.length;

// Search space for binary search.
let lo = 0, hi = n - 1;    
let res = n - 1;                  

while (lo <= hi) {
    let mid = Math.floor((lo + hi) / 2); 
    
    // Decreasing segment
    if (mid + 1 < n && arr[mid] > arr[mid + 1]) {
        res = mid;            
        hi = mid - 1;  
    }
    // Increasing segment
    else {
        lo = mid + 1;       
    }
}

return arr[res];              

}

const arr = [8, 10, 100, 400, 500, 3, 2, 1]; console.log(bitonicPoint(arr));

`