c/c++语言开发共享c中数组中的峰值元素

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

例如:

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

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

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

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

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

    以下链接将帮助您。

    根据其他人的答案(在我的下面)一些代码(使用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课程也可以检查出来

    需要了解更多c/c++开发分享c中数组中的峰值元素,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享c中数组中的峰值元素相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980305.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐