題目描述
峯值元素是指其值大於左右相鄰值的元素。
給定一個輸入數組 nums,其中 nums[i] ≠ nums[i+1],找到峯值元素並返回其索引。
數組可能包含多個峯值,在這種情況下,返回任何一個峯值所在位置即可。
你可以假設 nums[-1] = nums[n] = -∞。
說明:
你的解法應該是 O(logN) 時間複雜度的。
思路分析
- O(N)。遍歷所有元素,找到max或者找到大於前後元素的元素。
- O(N)。
- 因爲 nums[-1] 爲負無窮,所以 nums[0] > nums[-1],如果 nums[0] < nums[1] 則 nums[0] 就是峯值。
- 對索引1的元素而言,只用判斷後一個位置的元素。
- 所以將程序化簡爲遍歷所有元素,找到 nums[i] < nums[i+1] 的元素。
- O(logN),看到這個就要用二分。
- 套用模板,主要是在判斷語句該怎麼寫。
- 根據上一個分析,我們將 i 和 i+1 作比較,這裏也是一樣。
- 若 nums[i] > nums[i+1]則峯值在 i 之前;
- 若 nums[i] < nums[i+1]則峯值在 i+1 之後。
代碼實現
public static int findPeakElement(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}