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 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);    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 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

Python3

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

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

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

Javascript


Output:
3

Time Complexity: O(Log N)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up