且歌且行,眉目轻盈。何妨吟啸且|

胖柚の工作室

园龄:2年1个月粉丝:2关注:15

📂力扣
🔖二分
2024-07-21 09:46阅读: 5评论: 0推荐: 0

162. 寻找峰值

题目链接:

法一、暴力 O(n)

class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
if (n == 1) return 0;
if (n == 2) {
if (nums[0] < nums[1]) return 1;
else if (nums[0] > nums[1]) return 0;
}
for (int i = 0; i < n; i++) {
if (nums[0] > nums[1]) return 0;
if (nums[n - 2] < nums[n - 1]) return n - 1;
if (i > 0 && i < n - 1 && nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) return i;
}
return 0;
}
};

法二、二分

(数组不有序也可二分)

题目保证峰顶一定存在,且在 i<n1 时,若有 nums[i]<nums[i+1],则在 [i+1,n1] 必有峰顶存在。
同理,若 nums[i]>nums[i+1],则在 [0,i] 必有峰顶存在。

证明过程:

即峰顶及右侧为 true,峰顶左侧为 false

class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] < nums[mid + 1]) l = mid + 1;
else r = mid;
}
return l;
}
};

本文作者:胖柚の工作室

本文链接:https://www.cnblogs.com/pangyou3s/p/18314182

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   胖柚の工作室  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起