思路1——单次遍历
考虑三种情况:单调递增,单调递减,size为1
- 数组只有一个元素怎么办?——return 0
- 数组单调递减怎么办?——正常输出
- 数组为单调递增怎么办?——return 倒数两个中较大的值
代码1
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int size=nums.size();
if(size==1)
return 0;
for(int i=0;i<size-1;i++)//这里是size-1 不然i+1会访问出界
if(nums[i]>nums[i+1]&&i!=size-1)
return i;
return nums[size-1]>nums[size-2]? size-1:size-2;
}
};
思路2——二分查找
- 逆序往左边找,顺序为往右边找
- 去除循环中的“=” ——防止mid+1出界
- 考虑size为0和1的情况
代码2
class Solution {
public:
int findPeakElement(vector<int>& nums) {
//考虑size为0 size为1 的情况
if (nums.size() <=1)
return 0;
//正常情况
int n = nums.size();
int lo = 0, hi = n - 1;
while (lo < hi) {//去除等号 防止mid+1出界
int mid = (lo+hi)/2;
if (nums[mid] > nums[mid + 1])
hi = mid;
else
lo = mid + 1;
}
return lo;
}
};
解析2
return lo可以改为 return hi 吗
考虑当前lo为3 hi为4
若是顺序则 lo变为4
若是逆序则 hi变为3
也就是说最后 lo hi指针是相等的
**所以可以将return lo 改为 return hi**
本文介绍两种寻找峰值元素的方法:单次遍历法和二分查找法。峰值元素是指其值大于相邻元素的值。文章详细解释了每种方法的实现思路,并提供了C++代码示例。同时探讨了不同情况下返回值的正确性和合理性。
336

被折叠的 条评论
为什么被折叠?



