Poison

162. Find Peak Element

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
// 注意此处使用 left < right 能够保证最后一次 while 时存在两个元素,此时可以安全地访问 nums[mid + 1]
int mid = (left + right) >>> 1;
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
// 题目说明了相邻元素不相等
// nums[mid] > nums[mid + 1]
right = mid;
}
}

// 如果最后元素为 [5, 3], mid 向下取整,指向 5, 那么 right 会被赋值为 mid 且跳出循环,此时 left 指向的 5 为峰值元素
// 如果最后元素为 [3, 5], mid 向下取整,指向 3, 那么 left 会加一指向 5 且跳出循环,此时 left 指向的 5 为峰值元素
return left;
}
}

难点在于与相邻值比较,而不是与端点值比较。注意题目说明了 nums[i] != nums[i + 1],即相邻的元素值不可能相等,所以无需处理相等的情况。

162. Find Peak Element