# Find the maximum element in an array which is first increasing and then decreasing

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
```

## Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

Method 1 (Linear Search)
We can traverse the array and keep track of maximum and element. And finally return the maximum element.

## C++

 `// C++ program to find maximum  ` `// element  ` `#include ` `using` `namespace` `std; ` ` `  `// function to find the maximum element  ` `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];  ` `         `  `        ``// 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` `max;  ` `}  ` ` `  `/* Driver code*/` `int` `main()  ` `{  ` `    ``int` `arr[] = {1, 30, 40, 50, 60, 70, 23, 20};  ` `    ``int` `n = ``sizeof``(arr)/``sizeof``(arr);  ` `    ``cout << ``"The maximum element is "` `<< findMaximum(arr, 0, n-1);  ` `    ``return` `0;  ` `}  ` ` `  `// This is code is contributed by rathbhupendra `

## C

 `// C program to find maximum ` `// element ` `#include ` ` `  `// function to find the maximum element ` `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]; ` `// 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` `max; ` `} ` ` `  `/* Driver program to check above functions */` `int` `main() ` `{ ` `int` `arr[] = {1, 30, 40, 50, 60, 70, 23, 20}; ` `int` `n = ``sizeof``(arr)/``sizeof``(arr); ` `printf``(``"The maximum element is %d"``, findMaximum(arr, 0, n-1)); ` `getchar``(); ` `return` `0; ` `} `

## Java

 `// java program to find maximum ` `// element ` ` `  `class` `Main ` `{    ` `    ``// function to find the  ` `    ``// maximum element ` `    ``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; ` `    ``} ` `     `  `    ``// main function ` `    ``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

 `# Python3 program to find  ` `# maximum element ` ` `  `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` ` `  `# Driver program to check above functions */ ` `arr ``=` `[``1``, ``30``, ``40``, ``50``, ``60``, ``70``, ``23``, ``20``] ` `n ``=` `len``(arr) ` `print` `(``"The maximum element is %d"``%`  `        ``findMaximum(arr, ``0``, n``-``1``)) ` ` `  `# This code is contributed by Shreyanshi Arun. `

## C#

 `// C# program to find maximum ` `// element ` `using` `System; ` ` `  `class` `GFG ` `{ ` `    ``// function to find the  ` `    ``// maximum element ` `    ``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; ` `    ``} ` `     `  `    ``// Driver code ` `    ``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)); ` `    ``} ` `} ` ` `  `// This code is contributed by Sam007 `

## PHP

 ` ``\$max``) ` `        ``\$max` `= ``\$arr``[``\$i``]; ` `} ` `return` `\$max``; ` `} ` ` `  `// Driver Code ` `\$arr` `= ``array``(1, 30, 40, 50,  ` `             ``60, 70, 23, 20); ` `\$n` `= ``count``(``\$arr``); ` `echo` `"The maximum element is "``,  ` `      ``findMaximum(``\$arr``, 0, ``\$n``-1); ` ` `  `// This code is contributed by anuj_67. ` `?> `

Output :

```The maximum element is 70
```

Time Complexity : O(n)

Method 2 (Binary Search)
We can modify the standard Binary Search algorithm for the given type of arrays.
i) If the mid element is greater than both of its adjacent elements, then mid is the maximum.
ii) If mid element is greater than its next element and smaller than the previous element then maximum lies on left side of mid. Example array: {3, 50, 10, 9, 7, 6}
iii) If mid element is smaller than its next element and greater than the previous element then maximum lies on right side of mid. Example array: {2, 4, 6, 8, 10, 3, 1}

## C++

 `#include ` `using` `namespace` `std; ` ` `  `int` `findMaximum(``int` `arr[], ``int` `low, ``int` `high)  ` `{  ` ` `  `    ``/* Base Case: Only one element is present in arr[low..high]*/` `    ``if` `(low == high)  ` `        ``return` `arr[low];  ` `     `  `    ``/* If there are two elements and first is greater then  ` `        ``the first element is maximum */` `    ``if` `((high == low + 1) && arr[low] >= arr[high])  ` `        ``return` `arr[low];  ` `     `  `    ``/* If there are two elements and second is greater then  ` `        ``the second element is maximum */` `    ``if` `((high == low + 1) && arr[low] < arr[high])  ` `        ``return` `arr[high];  ` `     `  `    ``int` `mid = (low + high)/2; ``/*low + (high - low)/2;*/` `     `  `    ``/* If we reach a point where arr[mid] is greater than both of  ` `        ``its adjacent elements arr[mid-1] and arr[mid+1], then arr[mid]  ` `        ``is the maximum element*/` `    ``if` `( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1])  ` `        ``return` `arr[mid];  ` `     `  `    ``/* If arr[mid] is greater than the next ` `        ``element and smaller than the previous  ` `        ``element then maximum lies on left side of mid */` `    ``if` `(arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1])  ` `        ``return` `findMaximum(arr, low, mid-1);  ` `         `  `        ``// when arr[mid] is greater than arr[mid-1] ` `        ``// and smaller than arr[mid+1] ` `    ``else`  `        ``return` `findMaximum(arr, mid + 1, high);  ` `}  ` ` `  `/* Driver code */` `int` `main()  ` `{  ` `    ``int` `arr[] = {1, 3, 50, 10, 9, 7, 6};  ` `    ``int` `n = ``sizeof``(arr)/``sizeof``(arr);  ` `    ``cout << ``"The maximum element is "` `<< findMaximum(arr, 0, n-1);  ` `    ``return` `0;  ` `}  ` ` `  `// This is code is contributed by rathbhupendra `

## C

 `#include ` ` `  `int` `findMaximum(``int` `arr[], ``int` `low, ``int` `high) ` `{ ` ` `  `   ``/* Base Case: Only one element is present in arr[low..high]*/` `   ``if` `(low == high) ` `     ``return` `arr[low]; ` ` `  `   ``/* If there are two elements and first is greater then ` `      ``the first element is maximum */` `   ``if` `((high == low + 1) && arr[low] >= arr[high]) ` `      ``return` `arr[low]; ` ` `  `   ``/* If there are two elements and second is greater then ` `      ``the second element is maximum */` `   ``if` `((high == low + 1) && arr[low] < arr[high]) ` `      ``return` `arr[high]; ` ` `  `   ``int` `mid = (low + high)/2;   ``/*low + (high - low)/2;*/` ` `  `   ``/* If we reach a point where arr[mid] is greater than both of ` `     ``its adjacent elements arr[mid-1] and arr[mid+1], then arr[mid] ` `     ``is the maximum element*/` `   ``if` `( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1]) ` `      ``return` `arr[mid]; ` ` `  `   ``/* If arr[mid] is greater than the next element and smaller than the previous  ` `    ``element then maximum lies on left side of mid */` `   ``if` `(arr[mid] > arr[mid + 1] && arr[mid] < arr[mid - 1]) ` `     ``return` `findMaximum(arr, low, mid-1); ` `   ``else` `// when arr[mid] is greater than arr[mid-1] and smaller than arr[mid+1] ` `     ``return` `findMaximum(arr, mid + 1, high); ` `} ` ` `  `/* Driver program to check above functions */` `int` `main() ` `{ ` `   ``int` `arr[] = {1, 3, 50, 10, 9, 7, 6}; ` `   ``int` `n = ``sizeof``(arr)/``sizeof``(arr); ` `   ``printf``(``"The maximum element is %d"``, findMaximum(arr, 0, n-1)); ` `   ``getchar``(); ` `   ``return` `0; ` `} `

## Java

 `// java program to find maximum ` `// element ` ` `  `class` `Main ` `{    ` `    ``// function to find the  ` `    ``// maximum element ` `    ``static` `int` `findMaximum(``int` `arr[], ``int` `low, ``int` `high) ` `    ``{ ` `      `  `       ``/* Base Case: Only one element is  ` `          ``present in arr[low..high]*/` `       ``if` `(low == high) ` `         ``return` `arr[low]; ` `      `  `       ``/* If there are two elements and  ` `          ``first is greater then the first  ` `          ``element is maximum */` `       ``if` `((high == low + ``1``) && arr[low] >= arr[high]) ` `          ``return` `arr[low]; ` `      `  `       ``/* If there are two elements and  ` `          ``second is greater then the second  ` `          ``element is maximum */` `       ``if` `((high == low + ``1``) && arr[low] < arr[high]) ` `          ``return` `arr[high]; ` `         `  `       ``/*low + (high - low)/2;*/` `       ``int` `mid = (low + high)/``2``;    ` `      `  `       ``/* If we reach a point where arr[mid]  ` `          ``is greater than both of its adjacent  ` `          ``elements arr[mid-1] and arr[mid+1],  ` `          ``then arr[mid] is the maximum element*/` `       ``if` `( arr[mid] > arr[mid + ``1``] && arr[mid] > arr[mid - ``1``]) ` `          ``return` `arr[mid]; ` `      `  `       ``/* If arr[mid] is greater than the next  ` `          ``element and smaller than the previous  ` `          ``element then maximum lies on left side  ` `          ``of 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); ` `    ``} ` `     `  `    ``// main function ` `    ``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): ` `    ``# Base Case: Only one element is present in arr[low..high]*/ ` `    ``if` `low ``=``=` `high: ` `        ``return` `arr[low] ` `  `  `    ``# If there are two elements and first is greater then ` `    ``# the first element is maximum */ ` `    ``if` `high ``=``=` `low ``+` `1` `and` `arr[low] >``=` `arr[high]: ` `        ``return` `arr[low]; ` `  `  `    ``# If there are two elements and second is greater then ` `    ``# the second element is maximum */ ` `    ``if` `high ``=``=` `low ``+` `1` `and` `arr[low] < arr[high]: ` `        ``return` `arr[high] ` `  `  `    ``mid ``=` `(low ``+` `high)``/``/``2`   `#low + (high - low)/2;*/ ` `  `  `    ``# If we reach a point where arr[mid] is greater than both of ` `    ``# its adjacent elements arr[mid-1] and arr[mid+1], then arr[mid] ` `    ``# is the maximum element*/ ` `    ``if` `arr[mid] > arr[mid ``+` `1``] ``and` `arr[mid] > arr[mid ``-` `1``]: ` `        ``return` `arr[mid] ` `  `  `    ``# If arr[mid] is greater than the next element and smaller than the previous  ` `    ``# element then maximum lies on left side of mid */ ` `    ``if` `arr[mid] > arr[mid ``+` `1``] ``and` `arr[mid] < arr[mid ``-` `1``]: ` `        ``return` `findMaximum(arr, low, mid``-``1``) ` `    ``else``: ``# when arr[mid] is greater than arr[mid-1] and smaller than arr[mid+1] ` `        ``return` `findMaximum(arr, mid ``+` `1``, high) ` `  `  `# Driver program to check above functions */ ` `arr ``=` `[``1``, ``3``, ``50``, ``10``, ``9``, ``7``, ``6``] ` `n ``=` `len``(arr) ` `print` `(``"The maximum element is %d"``%` `findMaximum(arr, ``0``, n``-``1``)) ` ` `  `# This code is contributed by Shreyanshi Arun. `

## C#

 `// C# program to find maximum ` `// element ` `using` `System; ` ` `  `class` `GFG ` `{ ` `    ``// function to find the  ` `    ``// maximum element ` `    ``static` `int` `findMaximum(``int` `[]arr, ``int` `low, ``int` `high) ` `    ``{ ` `     `  `    ``/* Base Case: Only one element is  ` `        ``present in arr[low..high]*/` `    ``if` `(low == high) ` `        ``return` `arr[low]; ` `     `  `    ``/* If there are two elements and  ` `        ``first is greater then the first  ` `        ``element is maximum */` `    ``if` `((high == low + 1) && arr[low] >= arr[high]) ` `        ``return` `arr[low]; ` `     `  `    ``/* If there are two elements and  ` `        ``second is greater then the second  ` `        ``element is maximum */` `    ``if` `((high == low + 1) && arr[low] < arr[high]) ` `        ``return` `arr[high]; ` `         `  `    ``/*low + (high - low)/2;*/` `    ``int` `mid = (low + high)/2;  ` `     `  `    ``/* If we reach a point where arr[mid]  ` `        ``is greater than both of its adjacent  ` `        ``elements arr[mid-1] and arr[mid+1],  ` `        ``then arr[mid] is the maximum element*/` `    ``if` `( arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1]) ` `        ``return` `arr[mid]; ` `     `  `    ``/* If arr[mid] is greater than the next  ` `        ``element and smaller than the previous  ` `        ``element then maximum lies on left side  ` `        ``of 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); ` `    ``} ` `     `  `    ``// main function ` `    ``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)); ` `    ``} ` `} ` `// This code is contributed by Sam007 `

## PHP

 `= ``\$arr``[``\$high``]) ` `        ``return` `\$arr``[``\$low``]; ` `     `  `    ``/* If there are two elements ` `       ``and second is greater then ` `       ``the second element is maximum */` `    ``if` `((``\$high` `== ``\$low` `+ 1) &&  ` `         ``\$arr``[``\$low``] < ``\$arr``[``\$high``]) ` `        ``return` `\$arr``[``\$high``]; ` `     `  `    ``/*low + (high - low)/2;*/` `    ``\$mid` `= (``\$low` `+ ``\$high``) / 2;  ` `     `  `    ``/* If we reach a point where ` `       ``arr[mid] is greater than ` `       ``both of its adjacent elements ` `       ``arr[mid-1] and arr[mid+1], ` `       ``then arr[mid] is the maximum ` `       ``element */` `    ``if` `( ``\$arr``[``\$mid``] > ``\$arr``[``\$mid` `+ 1] && ` `         ``\$arr``[``\$mid``] > ``\$arr``[``\$mid` `- 1]) ` `        ``return` `\$arr``[``\$mid``]; ` `     `  `    ``/* If arr[mid] is greater than  ` `       ``the next element and smaller  ` `       ``than the previous element then ` `       ``maximum lies on left side of mid */` `    ``if` `(``\$arr``[``\$mid``] > ``\$arr``[``\$mid` `+ 1] &&  ` `        ``\$arr``[``\$mid``] < ``\$arr``[``\$mid` `- 1]) ` `        ``return` `findMaximum(``\$arr``, ``\$low``, ``\$mid` `- 1); ` `     `  `    ``// when arr[mid] is greater than  ` `    ``// arr[mid-1] and smaller than ` `    ``// arr[mid+1]     ` `    ``else`  `        ``return` `findMaximum(``\$arr``,  ` `                           ``\$mid` `+ 1, ``\$high``); ` `} ` ` `  `// Driver Code ` `\$arr` `= ``array``(1, 3, 50, 10, 9, 7, 6); ` `\$n` `= sizeof(``\$arr``); ` `echo``(``"The maximum element is "``);  ` `echo``(findMaximum(``\$arr``, 0, ``\$n``-1)); ` ` `  `// This code is contributed by nitin mittal. ` `?> `

Output :

```The maximum element is 50
```

Time Complexity : 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}.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Article Tags :

26

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.