Find the local minima in a given array

Objec­tive:  Given an array of integers write an algorithm to find the local minima.

Local Minima: An element is considered as local minima if it is less than both of its neighbors (if neighbors exist).

Example:

int [] arrA = {11, 4, 2, 5, 11, 13, 5};
Output: Local Minima is: 2 

int []arrA = {1,2,3,4}; 
Output: 1 

int []arrA = {3}; 
Output: 3 

int []arrA = {6,4}; 
Output: 4

NOTE: There could be many local minima’s, we need to find anyone.\

Approach:

Naïve: Use for loop and compare every element with its neighbor.

Time Complexity – O(n)

Binary Search Approach:

  • Check if the mid element is smaller than its left and right neighbors.
  • If the left neighbor is less than the mid element then make a recursive call to the left half of the array. (There will be at least one local minima in the left half, take few examples to check)
  • If the right neighbor is less than the mid element then make a recursive call to the right half of the array.

Time Complexity – O(logn)

Java

public class LocalMinimaBinary {

    public int find(int [] arrA, int start, int end){

        //find the mid
        int mid = start + (end-start)/2;
        int size = arrA.length;

        //check the local minima (element is smaller than its left and right neighbors)
        //first check if left and right neighbor exists
        if((mid==0 || arrA[mid-1]>arrA[mid]) &&
                (mid==size-1 || arrA[mid+1]>arrA[mid]))
            return arrA[mid];
        //check if left neighbor is less than mid element, if yes go left
        else if(mid>0 && arrA[mid]>arrA[mid-1]){
            return find(arrA, start, mid);
        }else { //if(mid<size-1 && arrA[mid]>arrA[mid+1])
            return find(arrA, mid+1, end);
        }
    }


    public static void main(String[] args) {
        LocalMinimaBinary l = new LocalMinimaBinary();
        int [] arrA = {11, 4, 2, 5, 11, 13, 5};
        System.out.println("Local Minima is: " + l.find(arrA,0,arrA.length));
    }
}

Output:

Local Minima is: 2

Reference: this