题目:162. 寻找峰值
思路:
题目有一点很重要:对于所有有效的 i
都有 nums[i] != nums[i + 1]
。
同时,峰值只要求大于相邻的数。
线性查找:从头开始,只需要判断是否大于下一个数;如果不大于下一个数,那么我们会继续查找,也就是说,只要来到了当前位置,就已经保证了当前位置大于前一个位置。
二分:找出中点mid
,判断mid
与mid+1
处值的大小
如果nums[mid] > nums[mid + 1]
:说明峰值在左区间,我们更新右区间为mid
;
如果nums[mid] < nums[mid + 1]
:说明峰值在右区间,我们更新左区间为mid+1
。
代码:线性查找
class Solution {
public int findPeakElement(int[] nums) {
for (int i = 0; i < nums.length - 1; i ++) {
if (nums[i] > nums[i + 1]) {
return i;
}
}
return nums.length - 1;
}
}
代码:二分
class Solution {
public int findPeakElement(int[] nums) {
return binary(0, nums.length - 1, nums);
}
public int binary(int l, int r, int[] nums) {
if (r == l) {
return l;
}
int mid = (l + r) / 2;
if (nums[mid] > nums[mid + 1]) {
r = mid;
}
if (nums[mid] < nums[mid + 1]) {
l = mid + 1;
}
return binary(l, r, nums);
}
}