Related Articles

# Minimum in an array which is first decreasing then increasing

• Difficulty Level : Medium
• Last Updated : 16 Mar, 2021

Given an array of N integers where array elements form a strictly decreasing and increasing sequence. The task is to find the smallest number in such an array.
Constraints: N >= 3
Examples:

```Input: a[] = {2, 1, 2, 3, 4}
Output: 1

Input: a[] = {8, 5, 4, 3, 4, 10}
Output: 3 ```

A naive approach is to linearly traverse the array and find out the smallest number. The time complexity will be thus O(N).
An efficient approach is to modify the binary search and use it. Divide the array into two halves use binary search to check if a[mid] < a[mid+1] or not. If a[mid] < a[mid+1], then the smallest number lies in the first half which is low to mid, else it lies in the second half which is mid+1 to high
Algorithm:

```while(lo > 1

if a[mid] < a[mid+1] then hi = mid

else lo = mid+1
} ```

Below is the implementation of the above approach:

## C++

 `// C++ program to find the smallest number``// in an array of decrease and increasing numbers``#include ``using` `namespace` `std;` `// Function to find the smallest number's index``int` `minimal(``int` `a[], ``int` `n)``{``    ``int` `lo = 0, hi = n - 1;` `    ``// Do a binary search``    ``while` `(lo < hi) {` `        ``// Find the mid element``        ``int` `mid = (lo + hi) >> 1;` `        ``// Check for break point``        ``if` `(a[mid] < a[mid + 1]) {``            ``hi = mid;``        ``}``        ``else` `{``            ``lo = mid + 1;``        ``}``    ``}` `    ``// Return the index``    ``return` `lo;``}` `// Driver Code``int` `main()``{``    ``int` `a[] = { 8, 5, 4, 3, 4, 10 };``    ``int` `n = ``sizeof``(a) / ``sizeof``(a);``    ``int` `ind = minimal(a, n);` `    ``// Print the smallest number``    ``cout << a[ind];``}`

## Java

 `// Java program to find the smallest number``// in an array of decrease and increasing numbers``class` `Solution``{``// Function to find the smallest number's index``static` `int` `minimal(``int` `a[], ``int` `n)``{``    ``int` `lo = ``0``, hi = n - ``1``;` `    ``// Do a binary search``    ``while` `(lo < hi) {` `        ``// Find the mid element``        ``int` `mid = (lo + hi) >> ``1``;` `        ``// Check for break point``        ``if` `(a[mid] < a[mid + ``1``]) {``            ``hi = mid;``        ``}``        ``else` `{``            ``lo = mid + ``1``;``        ``}``    ``}` `    ``// Return the index``    ``return` `lo;``}` `// Driver Code``public` `static` `void` `main(String args[])``{``    ``int` `a[] = { ``8``, ``5``, ``4``, ``3``, ``4``, ``10` `};``    ``int` `n = a.length;``    ``int` `ind = minimal(a, n);` `    ``// Print the smallest number``    ``System.out.println( a[ind]);``}``}``//contributed by Arnab Kundu`

## Python3

 `# Python 3 program to find the smallest``# number in a array of decrease and``# increasing numbers` `# function to find the smallest``# number's index``def` `minimal(a, n):``    ` `    ``lo, hi ``=` `0``, n ``-` `1``    ` `    ``# Do a binary search``    ``while` `lo < hi:``        ` `        ``# find the mid element``        ``mid ``=` `(lo ``+` `hi) ``/``/` `2``        ` `        ``# Check for break point``        ``if` `a[mid] < a[mid ``+` `1``]:``            ``hi ``=` `mid``        ``else``:``            ``lo ``=` `mid ``+` `1``        ``return` `lo``    ` `# Driver code``a ``=` `[``8``, ``5``, ``4``, ``3``, ``4``, ``10``]` `n ``=` `len``(a)` `ind ``=` `minimal(a, n)` `# print the smallest number``print``(a[ind])` `# This code is contributed``# by Mohit Kumar`

## C#

 `// C# program to find the smallest number``// in an array of decrease and increasing numbers``using` `System;``class` `Solution``{``// Function to find the smallest number's index``static` `int` `minimal(``int``[] a, ``int` `n)``{``    ``int` `lo = 0, hi = n - 1;` `    ``// Do a binary search``    ``while` `(lo < hi) {` `        ``// Find the mid element``        ``int` `mid = (lo + hi) >> 1;` `        ``// Check for break point``        ``if` `(a[mid] < a[mid + 1]) {``            ``hi = mid;``        ``}``        ``else` `{``            ``lo = mid + 1;``        ``}``    ``}` `    ``// Return the index``    ``return` `lo;``}` `// Driver Code``public` `static` `void` `Main()``{``    ``int``[] a = { 8, 5, 4, 3, 4, 10 };``    ``int` `n = a.Length;``    ``int` `ind = minimal(a, n);` `    ``// Print the smallest number``    ``Console.WriteLine( a[ind]);``}``}``//contributed by Mukul singh`

## PHP

 `> 1;` `        ``// Check for break point``        ``if` `(``\$a``[``\$mid``] < ``\$a``[``\$mid` `+ 1])``        ``{``            ``\$hi` `= ``\$mid``;``        ``}``        ``else``        ``{``            ``\$lo` `= ``\$mid` `+ 1;``        ``}``    ``}` `    ``// Return the index``    ``return` `\$lo``;``}` `// Driver Code``\$a` `= ``array``( 8, 5, 4, 3, 4, 10 );``\$n` `= sizeof(``\$a``);``\$ind` `= minimal(``\$a``, ``\$n``);` `// Print the smallest number``echo` `\$a``[``\$ind``];` `// This code is contributed``// by Sach_Code``?>`

## Javascript

 ``
Output:
`3`

Time Complexity: O(Log N)
Auxiliary Space: O(1) My Personal Notes arrow_drop_up