Minimum in an array which is first decreasing then increasing - GeeksforGeeks

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++
Java
Python3
C#
PHP
Javascript
// C++ program to find the smallest number// in an array of decrease and increasing numbers#include <bits/stdc++.h>using namespace std; // Function to find the smallest number's indexint 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 Codeint main(){    int a[] = { 8, 5, 4, 3, 4, 10 };    int n = sizeof(a) / sizeof(a[0]);    int ind = minimal(a, n);     // Print the smallest number    cout << a[ind];}
// Java program to find the smallest number// in an array of decrease and increasing numbersclass Solution{// Function to find the smallest number's indexstatic 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 Codepublic 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
# Python 3 program to find the smallest# number in a array of decrease and# increasing numbers # function to find the smallest# number's indexdef 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 codea = [8, 5, 4, 3, 4, 10] n = len(a) ind = minimal(a, n) # print the smallest numberprint(a[ind]) # This code is contributed# by Mohit Kumar
// C# program to find the smallest number// in an array of decrease and increasing numbersusing System;class Solution{// Function to find the smallest number's indexstatic 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 Codepublic 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// PHP program to find the smallest number// in an array of decrease and increasing numbers // Function to find the smallest// number's indexfunction minimal($a, $n){    $lo = 0;    $hi = $n - 1;     // Do a binary search    while ($lo < $hi)    {         // Find the mid element        $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$a = array( 8, 5, 4, 3, 4, 10 );$n = sizeof($a);$ind = minimal($a, $n); // Print the smallest numberecho $a[$ind]; // This code is contributed// by Sach_Code?>
<script>     // Javascript program to find the smallest number    // in an array of decrease and increasing numbers         // Function to find the smallest number's index    function minimal(a, n)    {        let lo = 0, hi = n - 1;               // Do a binary search        while (lo < hi) {                   // Find the mid element            let 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;    }         let a = [ 8, 5, 4, 3, 4, 10 ];    let n = a.length;    let ind = minimal(a, n);       // Print the smallest number    document.write(a[ind]);     </script>
3
 
Time Complexity: O(Log N) Auxiliary Space: O(1) 
andrew1234
Code_Mech
mohit kumar 29
Sach_Code
divyeshrabadiya07
Binary Search
Competitive Programming
Divide and Conquer
Searching
Searching
Divide and Conquer
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multistage Graph (Shortest Path)
Breadth First Traversal ( BFS ) on a 2D array
Difference between Backtracking and Branch-N-Bound technique
Most important type of Algorithms
5 Best Languages for Competitive Programming
Merge Sort
QuickSort
Binary Search
Maximum and minimum of an array using minimum number of comparisons
Program for Tower of Hanoi