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. A Bitonic point doesn’t exist if array is only decreasing or only increasing.
Examples :
Input : arr[] = {6, 7, 8, 11, 9, 5, 2, 1} Output: 11 All elements before 11 are smaller and all elements after 11 are greater. Input : arr[] = {-3, -2, 4, 6, 10, 8, 7, 1} Output: 10
Approach 1 : (Recursive Solution)
A simple solution for this problem is to use linear search. Element arr[i] is bitonic point if both i-1’th and i+1’th both elements are less than i’th element. Time complexity for this approach is O(n).
An efficient solution for this problem is to use modified binary search.
If arr[mid-1] < arr[mid] and arr[mid] > arr[mid+1] then we are done with bitonic point.
- If arr[mid] < arr[mid+1] then search in right sub-array, else search in left sub-array.
Implementation:
// C++ program to find bitonic point in a bitonic array. #include<bits/stdc++.h> using namespace std;
// Function to find bitonic point using binary search int binarySearch( int arr[], int left, int right)
{ if (left <= right)
{
int mid = (left+right)/2;
// base condition to check if arr[mid] is
// bitonic point or not
if (arr[mid-1]<arr[mid] && arr[mid]>arr[mid+1])
return mid;
// We assume that sequence is bitonic. We go to
// right subarray if middle point is part of
// increasing subsequence. Else we go to left
// subarray.
if (arr[mid] < arr[mid+1])
return binarySearch(arr, mid+1,right);
else
return binarySearch(arr, left, mid-1);
}
return -1;
} // Driver program to run the case int main()
{ int arr[] = {6, 7, 8, 11, 9, 5, 2, 1};
int n = sizeof (arr)/ sizeof (arr[0]);
int index = binarySearch(arr, 1, n-2);
if (index != -1)
cout << arr[index];
return 0;
} |
// Java program to find bitonic // point in a bitonic array. import java.io.*;
class GFG
{ // Function to find bitonic point
// using binary search
static int binarySearch( int arr[], int left,
int right)
{
if (left <= right)
{
int mid = (left + right) / 2 ;
// base condition to check if arr[mid]
// is bitonic point or not
if (arr[mid - 1 ] < arr[mid] &&
arr[mid] > arr[mid + 1 ])
return mid;
// We assume that sequence is bitonic. We go to
// right subarray if middle point is part of
// increasing subsequence. Else we go to left
// subarray.
if (arr[mid] < arr[mid + 1 ])
return binarySearch(arr, mid + 1 , right);
else
return binarySearch(arr, left, mid - 1 );
}
return - 1 ;
}
// Driver program
public static void main (String[] args)
{
int arr[] = { 6 , 7 , 8 , 11 , 9 , 5 , 2 , 1 };
int n = arr.length;
int index = binarySearch(arr, 1 , n - 2 );
if (index != - 1 )
System.out.println ( arr[index]);
}
} // This code is contributed by vt_m |
# Python3 program to find bitonic # point in a bitonic array. # Function to find bitonic point # using binary search def binarySearch(arr, left, right):
if (left < = right):
mid = (left + right) / / 2 ;
# base condition to check if
# arr[mid] is bitonic point
# or not
if (arr[mid - 1 ] < arr[mid] and arr[mid] > arr[mid + 1 ]):
return mid;
# We assume that sequence
# is bitonic. We go to right
# subarray if middle point
# is part of increasing
# subsequence. Else we go
# to left subarray.
if (arr[mid] < arr[mid + 1 ]):
return binarySearch(arr, mid + 1 ,right);
else :
return binarySearch(arr, left, mid - 1 );
return - 1 ;
# Driver Code arr = [ 6 , 7 , 8 , 11 , 9 , 5 , 2 , 1 ];
n = len (arr);
index = binarySearch(arr, 1 , n - 2 );
if (index ! = - 1 ):
print (arr[index]);
# This code is contributed by mits |
// C# program to find bitonic // point in a bitonic array. using System;
class GFG
{ // Function to find bitonic point
// using binary search
static int binarySearch( int []arr, int left,
int right)
{
if (left <= right)
{
int mid = (left + right) / 2;
// base condition to check if arr[mid]
// is bitonic point or not
if (arr[mid - 1] < arr[mid] &&
arr[mid] > arr[mid + 1])
return mid;
// We assume that sequence is bitonic. We go
// to right subarray if middle point is part of
// increasing subsequence. Else we go to left subarray.
if (arr[mid] < arr[mid + 1])
return binarySearch(arr, mid + 1, right);
else
return binarySearch(arr, left, mid - 1);
}
return -1;
}
// Driver program
public static void Main ()
{
int []arr = {6, 7, 8, 11, 9, 5, 2, 1};
int n = arr.Length;
int index = binarySearch(arr, 1, n - 2);
if (index != -1)
Console.Write ( arr[index]);
}
} // This code is contributed by nitin mittal |
<?php // PHP program to find bitonic // point in a bitonic array. // Function to find bitonic point // using binary search function binarySearch( $arr , $left , $right )
{ if ( $left <= $right )
{
$mid = ( $left + $right ) / 2;
// base condition to check if
// arr[mid] is bitonic point
// or not
if ( $arr [ $mid - 1] < $arr [ $mid ] &&
$arr [ $mid ] > $arr [ $mid + 1])
return $mid ;
// We assume that sequence
// is bitonic. We go to right
// subarray if middle point
// is part of increasing
// subsequence. Else we go
// to left subarray.
if ( $arr [ $mid ] < $arr [ $mid + 1])
return binarySearch( $arr , $mid + 1, $right );
else
return binarySearch( $arr , $left , $mid - 1);
}
return -1;
} // Driver Code
$arr = array (6, 7, 8, 11, 9, 5, 2, 1);
$n = sizeof( $arr );
$index = binarySearch( $arr , 1, $n -2);
if ( $index != -1)
echo $arr [ $index ];
// This code is contributed by nitin mittal ?> |
<script> // Javascript program to find bitonic // point in a bitonic array. // Function to find bitonic point // using binary search function binarySearch(arr , left,right)
{ if (left <= right)
{
var mid = parseInt((left + right) / 2);
// base condition to check if arr[mid]
// is bitonic point or not
if (arr[mid - 1] < arr[mid] &&
arr[mid] > arr[mid + 1])
return mid;
// We assume that sequence is bitonic. We go to
// right subarray if middle point is part of
// increasing subsequence. Else we go to left
// subarray.
if (arr[mid] < arr[mid + 1])
return binarySearch(arr, mid + 1, right);
else
return binarySearch(arr, left, mid - 1);
}
return -1;
} // Driver program var arr = [6, 7, 8, 11, 9, 5, 2, 1];
var n = arr.length;
var index = binarySearch(arr, 1, n - 2);
if (index != -1)
document.write( arr[index]); // This code is contributed by Amit Katiyar </script> |
11
Time complexity: O(Log n)
Auxiliary Space: O(1), as no extra space is required
Approach 2 : (Iterative Solution)
Same approach is also followed here, implemented binary search in iterative way.
// C++ program to find bitonic point in a bitonic array. #include <bits/stdc++.h> using namespace std;
// Function to find bitonic point using binary search int binarySearch( int arr[], int low, int high)
{ // binary search iterative
while (low <= high)
{
// finding the mid index
int mid = low + (high - low) / 2;
// if both the values on either side
// of mid index is lesser
if (arr[mid] > arr[mid - 1]
and arr[mid] > arr[mid + 1])
return mid;
// move to the right part
else if (arr[mid] < arr[mid + 1])
low = mid + 1;
// move to the left part
else
high = mid - 1;
}
// not found
return -1;
} // Driver program to run the case int main()
{ int arr[] = { 6, 7, 8, 11, 9, 5, 2, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
int index = binarySearch(arr, 1, n - 2);
if (index != -1)
cout << arr[index];
return 0;
} |
/*package whatever //do not write package name here */ import java.io.*;
class GFG {
// Function to find bitonic point using binary search
static int binarySearch( int arr[], int low, int high)
{
// binary search iterative
while (low <= high)
{
// finding the mid index
int mid = low + (high - low) / 2 ;
// if both the values on either side
// of mid index is lesser
if (arr[mid] > arr[mid - 1 ] && arr[mid] > arr[mid + 1 ])
return mid;
// move to the right part
else if (arr[mid] < arr[mid + 1 ])
low = mid + 1 ;
// move to the left part
else
high = mid - 1 ;
}
// not found
return - 1 ;
}
public static void main (String[] args)
{
int arr[] = { 6 , 7 , 8 , 11 , 9 , 5 , 2 , 1 };
int n = arr.length;
int index = binarySearch(arr, 1 , n - 2 );
if (index != - 1 )
System.out.println(arr[index]);
}
} // This code is contributed by aadityaburujwale. |
# python program to find bitonic point in a bitonic array. # Function to find bitonic point using Binary Search def binary_search(arr, low, high):
# binary search iterativ
while (low < = high):
# finding the mid index
mid = low + (high - low) / / 2
# if both the values on either side
# of mid index is lesser
if (arr[mid] > arr[mid - 1 ] and arr[mid] > arr[mid + 1 ]):
return mid
# move to the right part
elif (arr[mid] < arr[mid + 1 ]):
low = mid + 1
# move to the right part
else :
high = mid - 1
# Not Found
return - 1
# Driver Code arr = [ 6 , 7 , 8 , 11 , 9 , 5 , 2 , 1 ]
n = len (arr)
idx = binary_search(arr, 1 , n - 2 )
if (idx ! = - 1 ):
print (arr[idx])
# This code is contributed by vibhukarnwal077
|
using System;
public class GFG {
// Function to find bitonic point using binary search
static int binarySearch( int [] arr, int low, int high)
{
// binary search iterative
while (low <= high)
{
// finding the mid index
int mid = low + (high - low) / 2;
// if both the values on either side
// of mid index is lesser
if (arr[mid] > arr[mid - 1]
&& arr[mid] > arr[mid + 1])
return mid;
// move to the right part
else if (arr[mid] < arr[mid + 1])
low = mid + 1;
// move to the left part
else
high = mid - 1;
}
// not found
return -1;
}
public static void Main( string [] args)
{
int [] arr = { 6, 7, 8, 11, 9, 5, 2, 1 };
int n = arr.Length;
int index = binarySearch(arr, 1, n - 2);
if (index != -1)
Console.WriteLine(arr[index]);
}
} // This code is contributed by karandeep1234. |
// Function to find bitonic point using binary search
function binarySearch(arr, low, high)
{
// binary search iterative
while (low <= high)
{
// finding the mid index
var mid = low + parseInt((high - low) / 2);
// if both the values on either side
// of mid index is lesser
if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
{
return mid;
}
else if (arr[mid] < arr[mid + 1])
{
low = mid + 1;
}
else {
high = mid - 1;
}
}
// not found
return -1;
}
var arr = [6, 7, 8, 11, 9, 5, 2, 1];
var n = arr.length;
var index = binarySearch(arr, 1, n - 2);
if (index != -1)
{
console.log(arr[index]);
}
// This code is contributed by sourabhdalal0001. |
11
Time complexity : O(log n)
Auxiliary Space: O(1), as no extra space is required