【努力刷力扣】第四十七天 --- 852. 山脉数组的峰顶索引
前言
本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有1年奋斗刷题,明年去面试实习,加油!
题目要求:
整体思路
1、看题目要求,在一个数组上"查找"某个东西,我们最快速可以想到,那就枚举呗,我就从头向后查找,但是一旦数组很长,查找的东西在最后,那么就完蛋了,那么我们不妨就用二分检索,以lgn的时间复杂度找到目标,所以在数组上找目标,优先选择二分检索!!!!!!
2、本题很简单,就是可以把所有的数的排列理解成一个就一个山顶的高山,不用考虑太过于复杂。并且每次的mid左右,要么是递增的,要么是递减的,这都不是答案,如若是左右都小于mid处就找到答案了。
注意
因为"int mid = (left + right) / 2;"是向下取整,所以会得到一个特别的mid,即mid=0。这样的话mid-1会越界,但是mid一定不会是arr.size()-1,就保证了mid+1永不越界,所以判断的时候要把越界问题都考虑上。
具体代码一(内附注释):递归
class Solution {
public:
int answer = -1;
int peakIndexInMountainArray(vector<int>& arr) {
find(arr, 0, arr.size() - 1);
return answer;
}
void find(vector<int>& arr, int left, int right) {
if (left > right) {//出口
return;
}
int mid = (left + right) / 2;
if (mid - 1 >= 0 && arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]) {
answer = mid;//判断是不是目标,但同时要判断越不越界
}
else {
if (arr[mid] - arr[mid + 1] > 0) {//这里一定用mid+1,因为mid+1保证了不越界
find(arr, left, mid - 1);
}
else {
find(arr, mid + 1, right);
}
}
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
具体代码二(内附注释):迭代
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0;
int right = arr.size() - 1;
int ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] - arr[mid + 1] > 0) {//这里一定用mid+1,因为mid+1保证了不越界
right = mid - 1;
ans = mid;//这就像爬山一样,满足这个条件,就相当于我的后面比我小
//那么我就可能是峰顶,如果又遇到了这个情况,那么就更新即可
//最后一次的更新就是答案。
}
else {
left = mid + 1;
}
}
return ans;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):