Peak element in an array in c

后端 未结 3 1824
情歌与酒
情歌与酒 2021-02-04 00:30

I am given an array of integers. I have to find a peak element in it. An array element is peak if it is NOT smaller than its neighbors. For corner elements,cons

3条回答
  •  谎友^
    谎友^ (楼主)
    2021-02-04 01:21

    As per other's peoples answers (below mine) some code (with O(log n) ):

    // A divide and conquer solution to find a peak element element
    #include 
    
    // A binary search based function that returns index of a peak element
    int findPeakUtil(int arr[], int low, int high, int n)
    {
        // Fin index of middle element
        int mid = low + (high - low)/2;  /* (low + high)/2 */
    
        // Compare middle element with its neighbours (if neighbours exist)
        if ((mid == 0 || arr[mid-1] <= arr[mid]) &&
                (mid == n-1 || arr[mid+1] <= arr[mid]))
            return mid;
    
        // If middle element is not peak and its left neighbor is greater than it
        // then left half must have a peak element
        else if (mid > 0 && arr[mid-1] > arr[mid])
            return findPeakUtil(arr, low, (mid -1), n);
    
        // If middle element is not peak and its right neighbor is greater than it
        // then right half must have a peak element
        else return findPeakUtil(arr, (mid + 1), high, n);
    }
    
    // A wrapper over recursive function findPeakUtil()
    int findPeak(int arr[], int n)
    {
        return findPeakUtil(arr, 0, n-1, n);
    }
    
    /* Driver program to check above functions */
    int main()
    {
        int arr[] = {1, 3, 20, 4, 1, 0};
        int n = sizeof(arr)/sizeof(arr[0]);
        printf("Index of a peak point is %d", findPeak(arr, n));
        return 0;
    }
    

    Used this for MIT 6.006 OCW course may be check that out as well

    http://courses.csail.mit.edu/6.006/spring11/rec/rec02.pdf

提交回复
热议问题