162 寻找峰值
只需要找一个峰值即可,两边都是负无穷,二分法查找,只要二分出一个mid,右边数比它大就一定存在峰值在它右面。
注意!!::二分与左面比较容易陷入死循环。
Java:
class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int middle = left + (right - left) / 2;
if (nums[middle] < nums[middle + 1]) {
left = middle + 1;//middle总是偏向左边所以不用担心越界;
}
else {
right = middle;
}
}
return left;
}//题目表明数组相邻两个数字是不同的,所以要么是递增要么递减要么峰值,
//而递增递减都包含在结果中了。
}
Cpp:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
int mid = (left + right) / 2;
while (left < right) {
mid = (left + right) / 2;
if (nums[mid] < nums[mid + 1]) {//注意!!只有mid右邻的数字比他大才能证明峰值在它右面
left = mid + 1;
}
else {
right = mid;
}
}
return left;//题目表明数组相邻两个数字是不同的,所以要么是递增要么递减要么峰值,而递增递减都包含在结果中了。
}
};