c中数组中的峰值元素

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

例如:

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

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

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

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

是的,有可能以更好的时间复杂性找到它。 使用devide和conquer方法

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

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

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

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