[LeetCode]162. 寻找峰值(java实现)二分
1. 题目
2. 读题(需要重点注意的东西)
思路(二分): 1、当nums[i - 1] < nums[i]时: ① 如果从 i - 1 到 n - 1是单调的,那么这条直线单调上升,nums[n - 1] 就是峰值 ② 如果从 i - 1 到 n - 1不是单调的,那么一定存在一个点,使得nums[i] > nums[i + 1],这个点就是峰值 所以,当nums[i - 1] < nums[i]时,从 i - 1 到 n - 1中,一定存在一个峰值;
2、当nums[i - 1] > nums[i]时:同理可得[0,i−1]中一定包含一个峰值;
由此可知,存在一个性质,能将这段数分为两半,某一边一定有峰值,每次可以将答案区间缩小一半,因此可以使用二分求出这个峰值。
3. 解法
---------------------------------------------------解法---------------------------------------------------
class Solution { public int findPeakElement(int[] nums) { int l = 0,r = nums.length - 1; while(l < r){ int mid = l + r >> 1; if(nums[mid] > nums[mid+1]) r = mid; else l = mid + 1; } return l; } }
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
-
二分
6. 总结
下一篇:
《0-1背包问题》贪心策略