Peak element in an array in c

后端 未结 3 1823
情歌与酒
情歌与酒 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:11

    Yes, you can do it in O(log n) using an idea similar to binary search. Point to the middle of the vector and check its neighbours. If it is greater than both of its neighbours, then return the element, it is a peak. If the right element is greater, then find the peak recursively in the right side of the array. If the left element is greater, then find the peak recursively in the left side of the array.

    0 讨论(0)
  • 2021-02-04 01:16

    Yes, it is possible to find it in better time complexity. Using devide and conquer method

    Following link will help you. http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf

    0 讨论(0)
  • 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 <stdio.h>
    
    // 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

    0 讨论(0)
提交回复
热议问题