c中数组中的峰值元素

时间:2013-06-05 07:04:11

标签: c arrays

我得到了一个整数数组。我必须在其中找到一个峰值元素。 如果数组元素不小于,则数组元素为峰值。 对于角落元素,仅考虑一个邻居。

例如:

对于输入数组{10, 20, 15, 2, 23, 90, 67} 有两个峰值元素:20和90.我需要返回任何一个峰值元素。

我尝试的解决方案是阵列的线性扫描,我发现了一个峰值元素。该方法的最坏情况时间复杂度为O(n)。

我们能否在最差时间复杂度中找到比O(n)更好的峰值元素?

3 个答案:

答案 0 :(得分:22)

是的,您可以使用类似于二进制搜索的想法在O(log n)中执行此操作。指向向量的中间并检查其邻居。如果它大于两个的邻居,那么返回元素,它就是一个峰值。如果右边的元素更大,则在数组的右侧递归地找到峰值。如果左边的元素较大,则在数组的左侧递归地找到峰值。

答案 1 :(得分:10)

是的,有可能以更好的时间复杂性找到它。使用分而治之的方法

以下链接可以帮助您。 http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf

答案 2 :(得分:2)

根据其他人的回答(在我的下面)一些代码(带有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;
}

用于麻省理工学院6.006 OCW课程也可以检查出来

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