題目鏈接
題目:
分析:
- 因為題目中要找的是任意一個峰值即可, 所以和<山脈數組的峰值索引>這道題差不多
- 因為峰值左右都小于峰值, 所以具有"二段性", 可以使用二分查找算法
- 如果nums[mid] < nums[mid + 1], mid一定不是峰值, 所以left = mid + 1
- 如果nums[mid] >?nums[mid + 1], mid可能是峰值, 所以right?= mid
- 因此匹配二分查找算法的模版二, mid =?left +(right - left) /2
- 唯一與<山脈數組的峰值索引>這道題不同的是,?<山脈數組的峰值索引>數組中只有一個峰值, 而這道題我們用二分查找找的是最接近中間的峰值, 說明不是只有嚴格的有序才能用二分查找
代碼:
class Solution {public int findPeakElement(int[] nums) {int left = 0;int right = nums.length-1;while(left < right){int mid = left +(right - left) /2;if(nums[mid] > nums[mid + 1]) right = mid;else left = mid + 1;}return left;}
}