寻找峰值
题目解析


题目是给了我们一个数组,这个数组并不像我们之前的数组一样具有明显的二段性,这个数组可以说是一个完全无序的数组,而我们要寻找的,是满足大于左右两值的数的索引。暴力解法逻辑简单但效率较低,直接遍历数组即可,只要满足大于 i - 1 和 i + 1 就可以了。
时间复杂度为 O(N)。但是我们没有利用题目的条件,虽然是无序的,但是峰值的条件是大于左右两边,我们可以利用这个条件,使用二分查找。
算法原理
题目的隐含条件,左右两端都是负无穷的,数组可以有二段性。

我们随便定义一个位置,如果 arr[i] > arr[i + 1] 的话,那么在左区间一定是存在答案的,因为从 num[-1] 开始是负无穷,此时我们可以套用查找左端点的二分模板,对于右边的端点同理,如果 arr[i] < arr[i + 1],代表右边有答案,因为 nums[n] 也是负无穷的。
所以我们就可以直接进入到算法编写了。
算法编写
class Solution { public: int findPeakElement(vector<int>& nums) { int left = 0, right = nums.size() - 1; while(left < right) { int mid = left + (right - left + 1) / 2; if(nums[mid] > nums[mid - 1]) left = mid; else right = mid - 1; } return left; } };
所以,不是非要有序的才会存在二段性,像这种完全无序的,也是会存在二段性的。








