Find the maximum element in an array which is first increasing and then decreasing
Last Updated :
14 Aug, 2023
Given an array of integers which is initially increasing and then decreasing, find the maximum value in the array.
Examples :
Input: arr[] = {8, 10, 20, 80, 100, 200, 400, 500, 3, 2, 1}
Output: 500
Input: arr[] = {1, 3, 50, 10, 9, 7, 6}
Output: 50
Corner case (No decreasing part)
Input: arr[] = {10, 20, 30, 40, 50}
Output: 50
Corner case (No increasing part)
Input: arr[] = {120, 100, 80, 20, 0}
Output: 120
Method 1 (Linear Search): We can traverse the array and keep track of maximum and element. And finally return the maximum element.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int findMaximum( int arr[], int low, int high)
{
int max = arr[low];
int i;
for (i = low + 1; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
else
break ;
}
return max;
}
int main()
{
int arr[] = {1, 30, 40, 50, 60, 70, 23, 20};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "The maximum element is " << findMaximum(arr, 0, n-1);
return 0;
}
|
C
#include <stdio.h>
int findMaximum( int arr[], int low, int high)
{
int max = arr[low];
int i;
for (i = low+1; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
else
break ;
}
return max;
}
int main()
{
int arr[] = {1, 30, 40, 50, 60, 70, 23, 20};
int n = sizeof (arr)/ sizeof (arr[0]);
printf ( "The maximum element is %d" , findMaximum(arr, 0, n-1));
getchar ();
return 0;
}
|
Java
class Main
{
static int findMaximum( int arr[], int low, int high)
{
int max = arr[low];
int i;
for (i = low; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
}
return max;
}
public static void main (String[] args)
{
int arr[] = { 1 , 30 , 40 , 50 , 60 , 70 , 23 , 20 };
int n = arr.length;
System.out.println( "The maximum element is " +
findMaximum(arr, 0 , n- 1 ));
}
}
|
Python3
def findMaximum(arr, low, high):
max = arr[low]
i = low
for i in range (high + 1 ):
if arr[i] > max :
max = arr[i]
return max
arr = [ 1 , 30 , 40 , 50 , 60 , 70 , 23 , 20 ]
n = len (arr)
print ( "The maximum element is %d" %
findMaximum(arr, 0 , n - 1 ))
|
C#
using System;
class GFG
{
static int findMaximum( int []arr, int low, int high)
{
int max = arr[low];
int i;
for (i = low; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
}
return max;
}
public static void Main ()
{
int []arr = {1, 30, 40, 50, 60, 70, 23, 20};
int n = arr.Length;
Console.Write( "The maximum element is " +
findMaximum(arr, 0, n-1));
}
}
|
Javascript
<script>
function findMaximum(arr, low, high)
{
var max = arr[low];
var i;
for (i = low + 1; i <= high; i++)
{
if (arr[i] > max)
max = arr[i];
else
break ;
}
return max;
}
var arr = [1, 30, 40, 50, 60, 70, 23, 20];
var n = arr.length;
document.write( "The maximum element is " + findMaximum(arr, 0, n-1));
</script>
|
PHP
<?php
function findMaximum( $arr , $low , $high )
{
$max = $arr [ $low ];
$i ;
for ( $i = $low ; $i <= $high ; $i ++)
{
if ( $arr [ $i ] > $max )
$max = $arr [ $i ];
}
return $max ;
}
$arr = array (1, 30, 40, 50,
60, 70, 23, 20);
$n = count ( $arr );
echo "The maximum element is " ,
findMaximum( $arr , 0, $n -1);
?>
|
Output
The maximum element is 70
Time Complexity : O(n)
Auxiliary Space: O(1)
Method 2 (Binary Search – Recursive Solution)
The iterative approach of Binary search to find the maximum element in an array which is first increasing and then decreasing.
The standard binary search approach can be modified in the following ways :-
- If the mid element is greater than both of its adjacent elements, then mid is the maximum.
- If the mid element is smaller than its next element then we should try to search on the right half of the array. So, make, low = mid + 1. Example array : {2, 4, 6, 8, 10, 3, 1}
- If the mid element is greater than the next element, similarly we should try to search on the left half. So, make, high = mid – 1. Example array: {3, 50, 10, 9, 7, 6}
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int findMaximum( int arr[], int low, int high)
{
if (low == high)
return arr[high];
int mid = low + (high - low) / 2;
if (arr[mid] > arr[mid - 1] and arr[mid] > arr[mid + 1])
return arr[mid];
else if (arr[mid] < arr[mid + 1])
return findMaximum(arr, mid + 1, high);
else
return findMaximum(arr, low, mid - 1);
}
int main()
{
int arr[] = { 1, 3, 50, 10, 9, 7, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "The maximum element is "
<< findMaximum(arr, 0, n - 1);
return 0;
}
|
C
#include <stdio.h>
int findMaximum( int arr[], int low, int high)
{
if (low == high)
return arr[low];
if ((high == low + 1) && arr[low] >= arr[high])
return arr[low];
if ((high == low + 1) && arr[low] < arr[high])
return arr[high];
int mid = (low + high)/2;
if ( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])
return arr[mid];
if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])
return findMaximum(arr, low, mid-1);
else
return findMaximum(arr, mid + 1, high);
}
int main()
{
int arr[] = {1, 3, 50, 10, 9, 7, 6};
int n = sizeof (arr)/ sizeof (arr[0]);
printf ( "The maximum element is %d" , findMaximum(arr, 0, n-1));
getchar ();
return 0;
}
|
Java
class Main
{
static int findMaximum( int arr[], int low, int high)
{
if (low == high)
return arr[low];
if ((high == low + 1 ) && arr[low] >= arr[high])
return arr[low];
if ((high == low + 1 ) && arr[low] < arr[high])
return arr[high];
int mid = (low + high)/ 2 ;
if ( arr[mid] > arr[mid + 1 ] && arr[mid] > arr[mid - 1 ])
return arr[mid];
if (arr[mid] > arr[mid + 1 ] && arr[mid] < arr[mid - 1 ])
return findMaximum(arr, low, mid- 1 );
else
return findMaximum(arr, mid + 1 , high);
}
public static void main (String[] args)
{
int arr[] = { 1 , 3 , 50 , 10 , 9 , 7 , 6 };
int n = arr.length;
System.out.println( "The maximum element is " +
findMaximum(arr, 0 , n- 1 ));
}
}
|
Python3
def findMaximum(arr, low, high):
if low = = high:
return arr[low]
if high = = low + 1 and arr[low] > = arr[high]:
return arr[low];
if high = = low + 1 and arr[low] < arr[high]:
return arr[high]
mid = (low + high) / / 2
if arr[mid] > arr[mid + 1 ] and arr[mid] > arr[mid - 1 ]:
return arr[mid]
if arr[mid] > arr[mid + 1 ] and arr[mid] < arr[mid - 1 ]:
return findMaximum(arr, low, mid - 1 )
else :
return findMaximum(arr, mid + 1 , high)
arr = [ 1 , 3 , 50 , 10 , 9 , 7 , 6 ]
n = len (arr)
print ( "The maximum element is %d" % findMaximum(arr, 0 , n - 1 ))
|
C#
using System;
class GFG
{
static int findMaximum( int []arr, int low, int high)
{
if (low == high)
return arr[low];
if ((high == low + 1) && arr[low] >= arr[high])
return arr[low];
if ((high == low + 1) && arr[low] < arr[high])
return arr[high];
int mid = (low + high)/2;
if ( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])
return arr[mid];
if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])
return findMaximum(arr, low, mid-1);
else
return findMaximum(arr, mid + 1, high);
}
public static void Main()
{
int []arr = {1, 3, 50, 10, 9, 7, 6};
int n = arr.Length;
Console.Write( "The maximum element is " +
findMaximum(arr, 0, n-1));
}
}
|
Javascript
<script>
function findMaximum( arr, low, high)
{
if (low == high)
return arr[low];
if ((high == low + 1) && arr[low] >= arr[high])
return arr[low];
if ((high == low + 1) && arr[low] < arr[high])
return arr[high];
mid = (low + high)/2;
if ( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])
return arr[mid];
if (arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])
return findMaximum(arr, low, mid-1);
return findMaximum(arr, mid + 1, high);
}
arr = new Array(1, 3, 50, 10, 9, 7, 6);
n = arr.length;
document.write( "The maximum element is" + "\n" + findMaximum(arr, 0, n-1));
</script>
|
PHP
<?php
function findMaximum( $arr , $low , $high )
{
if ( $low == $high )
return $arr [ $low ];
if (( $high == $low + 1) &&
$arr [ $low ] >= $arr [ $high ])
return $arr [ $low ];
if (( $high == $low + 1) &&
$arr [ $low ] < $arr [ $high ])
return $arr [ $high ];
$mid = ( $low + $high ) / 2;
if ( $arr [ $mid ] > $arr [ $mid + 1] &&
$arr [ $mid ] > $arr [ $mid - 1])
return $arr [ $mid ];
if ( $arr [ $mid ] > $arr [ $mid + 1] &&
$arr [ $mid ] < $arr [ $mid - 1])
return findMaximum( $arr , $low , $mid - 1);
else
return findMaximum( $arr ,
$mid + 1, $high );
}
$arr = array (1, 3, 50, 10, 9, 7, 6);
$n = sizeof( $arr );
echo ( "The maximum element is " );
echo (findMaximum( $arr , 0, $n -1));
?>
|
Output
The maximum element is 50
Time Complexity : O(logn)
Auxiliary Space : O(logn)
This method works only for distinct numbers. For example, it will not work for an array like {0, 1, 1, 2, 2, 2, 2, 2, 3, 4, 4, 5, 3, 3, 2, 2, 1, 1}.
Method 3 (Binary Search – Iterative Solution)
The iterative approach of Binary search to find the maximum element in an array which is first increasing and then decreasing.
The standard binary search approach can be modified in the following ways :-
- If the mid element is greater than both of its adjacent elements, then mid is the maximum.
- If the mid element is smaller than its next element then we should try to search on the right half of the array. So, make, low = mid + 1 .Example array : {2, 4, 6, 8, 10, 3, 1}
- If the mid element is greater than the next element, similarly we should try to search on the left half. So, make, high = mid – 1. Example array : {3, 50, 10, 9, 7, 6}
Implementation:
C++
#include <iostream>
using namespace std;
int maxInBitonic( int arr[], int low, int high)
{
int n = high + 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] > arr[mid+1] and arr[mid] > arr[mid-1])
return arr[mid];
else if (arr[mid] < arr[mid + 1])
low = mid + 1;
else
high = mid - 1;
}
return arr[high];
}
int main()
{
int arr[] = { 1, 3, 50, 10, 9, 7, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "The maximum element is "
<< maxInBitonic(arr, 0, n - 1);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int maxInBitonic( int arr[], int l, int r)
{
while (l <= r) {
int m = l + (r - l) / 2 ;
/****Base Cases Starts*****/
if (l==r)
return arr[l];
if ((r == l + 1 ) && arr[l] >= arr[r])
return arr[l];
if ((r == l + 1 ) && arr[l] < arr[r])
return arr[r];
if (arr[m] > arr[m + 1 ] && arr[m] > arr[m - 1 ])
return arr[m];
if (arr[m] > arr[m + 1 ] && arr[m] < arr[m - 1 ])
r = m - 1 ;
else
l = m + 1 ;
}
return - 1 ;
}
public static void main(String[] args)
{
int arr[] = { 1 , 3 , 50 , 10 , 9 , 7 , 6 };
int n = arr.length;
System.out.print( "The maximum element is "
+ maxInBitonic(arr, 0 , n - 1 ));
}
}
|
Python3
def maxInBitonic(arr, l, r) :
while (l < = r) :
m = int (l + (r - l) / 2 )
if (l = = r)
return arr[l];
if ((r = = l + 1 ) and arr[l] > = arr[r]):
return arr[l]
if ((r = = l + 1 ) and arr[l] < arr[r]):
return arr[r]
if (arr[m] > arr[m + 1 ] and arr[m] > arr[m - 1 ]):
return arr[m]
if (arr[m] > arr[m + 1 ] and arr[m] < arr[m - 1 ]) :
r = m - 1
else :
l = m + 1
return - 1
arr = [ 1 , 3 , 50 , 10 , 9 , 7 , 6 ]
n = len (arr)
print ( "The maximum element is " , maxInBitonic(arr, 0 , n - 1 ))
|
C#
using System;
class GFG{
static int maxInBitonic( int []arr, int l, int r)
{
while (l <= r) {
int m = l + (r - l) / 2;
if (l==r)
return arr[l];
if ((r == l + 1) && arr[l] >= arr[r])
return arr[l];
if ((r == l + 1) && arr[l] < arr[r])
return arr[r];
if (arr[m] > arr[m + 1] && arr[m] > arr[m - 1])
return arr[m];
if (arr[m] > arr[m + 1] && arr[m] < arr[m - 1])
r = m - 1;
else
l = m + 1;
}
return -1;
}
public static void Main(String[] args)
{
int []arr = { 1, 3, 50, 10, 9, 7, 6 };
int n = arr.Length;
Console.Write( "The maximum element is "
+ maxInBitonic(arr, 0, n - 1));
}
}
|
Javascript
<script>
function maxInBitonic(arr, l, r)
{
while (l <= r) {
var m = l + (r - l) / 2;
if (l==r)
return arr[l];
if ((r == l + 1) && arr[l] >= arr[r])
return arr[l];
if ((r == l + 1) && arr[l] < arr[r])
return arr[r];
if (arr[m] > arr[m + 1] && arr[m] > arr[m - 1])
return arr[m];
if (arr[m] > arr[m + 1] && arr[m] < arr[m - 1])
r = m - 1;
else
l = m + 1;
}
return -1;
}
var arr = [ 1, 3, 50, 10, 9, 7, 6 ];
var n = arr.length;
document.write( "The maximum element is "
+ maxInBitonic(arr, 0, n - 1));
</script>
|
Output
The maximum element is 50
Time Complexity: O(log n)
Auxiliary Space: O(1)
Method 4 (Using Stack) :
1.Create an empty stack to hold the indices of the array elements.
2.Traverse the array from left to right until we find the maximum element. Push the index of each element onto the
stack as long as the element is less than or equal to the previous element.
3.Once we find an element that is greater than the previous element, we know that the maximum element has been
reached. We can then pop all the indices from the 4.stack until we find an index whose corresponding element
is greater than the current element.
4.The maximum element is the element corresponding to the last index remaining on the stack.
Implementation of above approach :
C++
#include <bits/stdc++.h>
using namespace std;
int findMax( int arr[], int n)
{
stack< int > s;
int max = 0;
for ( int i = 0; i < n; i++) {
if (s.empty() || arr[i] <= arr[s.top()]) {
s.push(i);
}
else {
while (!s.empty() && arr[i] > arr[s.top()]) {
int index = s.top();
s.pop();
if (arr[index] > max) {
max = arr[index];
}
}
s.push(i);
}
}
while (!s.empty()) {
int index = s.top();
s.pop();
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
int main()
{
int arr[] = { 1, 3, 50, 10, 9, 7, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "The maximum element is "
<< findMax(arr, n);
return 0;
}
|
Java
import java.util.Stack;
public class Main {
public static int findMax( int [] arr, int n)
{
Stack<Integer> s = new Stack<>();
int max = 0 ;
for ( int i = 0 ; i < n; i++) {
if (s.empty() || arr[i] <= arr[s.peek()]) {
s.push(i);
}
else {
while (!s.empty()
&& arr[i] > arr[s.peek()]) {
int index = s.peek();
s.pop();
if (arr[index] > max) {
max = arr[index];
}
}
s.push(i);
}
}
while (!s.empty()) {
int index = s.peek();
s.pop();
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
public static void main(String[] args)
{
int [] arr = { 1 , 3 , 50 , 10 , 9 , 7 , 6 };
int n = arr.length;
System.out.println( "The maximum element is "
+ findMax(arr, n));
}
}
|
Python3
def findMax(arr, n):
s = []
max = 0
for i in range (n):
if not s or arr[i] < = arr[s[ - 1 ]]:
s.append(i)
else :
while s and arr[i] > arr[s[ - 1 ]]:
index = s.pop()
if arr[index] > max :
max = arr[index]
s.append(i)
while s:
index = s.pop()
if arr[index] > max :
max = arr[index]
return max
arr = [ 1 , 3 , 50 , 10 , 9 , 7 , 6 ]
n = len (arr)
print ( "The maximum element is" , findMax(arr, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int FindMax( int [] arr, int n)
{
Stack< int > stack = new Stack< int >();
int max = 0;
for ( int i = 0; i < n; i++)
{
if (stack.Count == 0 || arr[i] <= arr[stack.Peek()])
{
stack.Push(i);
}
else
{
while (stack.Count > 0 && arr[i] > arr[stack.Peek()])
{
int index = stack.Pop();
if (arr[index] > max)
{
max = arr[index];
}
}
stack.Push(i);
}
}
while (stack.Count > 0)
{
int index = stack.Pop();
if (arr[index] > max)
{
max = arr[index];
}
}
return max;
}
static void Main()
{
int [] arr = { 1, 3, 50, 10, 9, 7, 6 };
int n = arr.Length;
Console.WriteLine( "The maximum element is " + FindMax(arr, n));
}
}
|
Javascript
function findMax(arr) {
const stack = [];
let max = 0;
for (let i = 0; i < arr.length; i++) {
if (stack.length === 0 || arr[i] <= arr[stack[stack.length - 1]]) {
stack.push(i);
} else {
while (stack.length > 0 && arr[i] > arr[stack[stack.length - 1]]) {
const index = stack.pop();
if (arr[index] > max) {
max = arr[index];
}
}
stack.push(i);
}
}
while (stack.length > 0) {
const index = stack.pop();
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
const arr = [1, 3, 50, 10, 9, 7, 6];
console.log( "The maximum element is " + findMax(arr));
|
Output
The maximum element is 50
Time Complexity : O(n)
Auxiliary Space : O(n)
Please Login to comment...