162. 寻找峰值
https://leetcode.cn/problems/find-peak-element/?envType=study-plan-v2&envId=top-interview-150
思路:
方法一:读完题后我最先想到的解法是单调栈,我们维护一个递增的单调栈,栈顶元素一定是最大的,当出现要弹栈操作是就说明栈顶就是“山峰”。
public int findPeakElement(int[] nums) {Stack<Integer> st = new Stack<>(); // 递增栈int cnt = 0;// 维护栈的单调性while(cnt < nums.length && (st.isEmpty() || st.peek() <= nums[cnt])) {st.push(nums[cnt++]);}return cnt-1;}
方法二:这题是在二分栏目下的嘛,我们可以使用二分,想必一开始大家看到的时候其实很难和二分联系起来(因为二分的前提是有序),给的nums显然是无序的,但是我们再思考一下就可以发现要求我们返回的答案是下标,而下标肯定是有序递增的,所以我们可以二分答案,然后判断这个下标来移动l或r。
我的判断是:如果nums[mid]>nums[mid+1],说明l到mid之间一定存在山峰,所以r=mid,反之l=mid+1。
tip:对于方法二我一开始还有些疑惑因为对于单调递增的情况不存在山峰但是也会返回一个下标,后来测试那试了以下就是拿最大值当的山峰。
public int findPeakElement(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[mid + 1]) { // l到mid之间一定存在山峰right = mid;} else { // mid+1到r之间一定存在山峰left = mid + 1;}}return left;}