162. Find Peak Element
分界点很多找其中任意一个的情况。例如findPeak, 它的peak(波)可以有很多,peak(波)之间也没有性质能把它们区分出来,乍看上去不适用于二分。但题目要求并不是找特定的peak,而是找到任意一个就行了。因此给定的数列可以划分成俩坨,前面那坨满足严格上升(题有说前后俩元素不会相等),后面那坨满足严格下降,返回的也就是个划分点peak。只是我们无法用这个方法找到特定的peak。
由于要返回的是peak, 如果在判断上升后把start移到mid后可能会错过这最后的peak。因此判断不是上升把end移动到mid前是最合理的。还有当mid == start时,如[2, 3],因为现在不会让start移到mid后,需要强制退出。
/*
* @lc app=leetcode id=162 lang=cpp
*
* [162] Find Peak Element
*/
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if (nums.size() == 1) return 0;
int start = 1, end = nums.size() - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (start == mid) {
start = nums[end] > nums[start] ? end : start;
break;
}
if (!(nums[mid] > nums[mid - 1])) end = mid - 1;
else start = mid;
}
return start == 1 && nums[0] > nums[start] ? 0 : start;
}
};
Last updated
Was this helpful?