【LeetCode刷题】Day 13
- 题目1:852.山脉数组的峰顶索引
- 思路分析:
- 思路1:暴力枚举O(N)
- 思路2:二分查找O(logN)
- 题目2:162.寻找峰值
- 思路分析:
- 思路1:二分查找O(logN)
题目1:852.山脉数组的峰顶索引
思路分析:
暴力枚举的话就是找单调性,越来越大,直到找到,一个数大于后一个数。这个数就是最大值。
就是单调性相关的问题
思路1:暴力枚举O(N)
思路2:二分查找O(logN)
二分查找:二段性:[单调递增(包括峰顶)][单调递减],左区间找右值,右边左不变,-1
就+1
代码实现:
class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left=0,right=arr.size()-1;while(left<right){int mid =left+(right-left+1)/2;if(arr[mid]>arr[mid-1]) left=mid;else right=mid-1;}return left;}
};
LeetCode链接:852.山脉数组的峰顶索引
题目2:162.寻找峰值
思路分析:
这题情况还是比较多,递增开始,还是递减开始,递增开始我们需要找后面比较大的值,递减开始,说明第一个值就可以。
思路1:二分查找O(logN)
不管哪种,我们只需要找区间中峰顶的值,反正逻辑是一样的,下降就找前面,增加就找后面,不管中间怎么变,是这个“山峰”跳到另一个“山峰”,反正找到其中一组就可以,随着区间不断缩小,也会集中在一个“山峰”上。
代码实现
class Solution {
public:int findPeakElement(vector<int>& nums) {int right=nums.size()-1,left=0;while(left<right){ int mid = left+(right-left+1)/2;if(nums[mid]>nums[mid-1]) left=mid;else right=mid-1;}return left;}
};
LeetCode链接:162.寻找峰值