二分查找算法只寻找峰值
2026/5/12 14:03:38 网站建设 项目流程

我们先来看题目描述:

峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

解答思路

这里题目要求实现时间复杂度为 O(log n) 的算法,所以很自然的想到了二分查找算法。

题目中输入的数组无法保证是完全有序的,不过不用担心,因为题目中不要求必须找到最大的那个峰值,所以我们只需要从数组的任意位置开始,对局部的有序区间进行搜索即可。

套用前面的二分查找模板,在检查 nums[mid] 和其相邻两个元素位置之间的关系时进行如下分类:

  • 如果 nums[mid-1] < nums[mid] > nums[mid+1],则代表找到了一个峰值;
  • 如果 nums[mid-1] < nums[mid] < nums[mid+1],则代表一个上升的趋势 ,这时需要向右搜索;
  • 如果 nums[mid-1] > nums[mid] > nums[mid+1],则代表一个下降的趋势 ,这时需要向左搜索;
  • 如果 nums[mid-1] > nums[mid] < nums[mid+1],则代表找到了一个谷底,此时向左或是向右搜索都可以。

此外,我们还需要注意一些边界条件,例如 nums 中只有一个元素的情况,或是 nums 中不存在峰值的情况。

下面是一个动画演示的例子,感兴趣的同学可以自己动手实现一下:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询