题解 | #寻找峰值# C++ 遍历解法

寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

class Solution {
  public:
    int findPeakElement(vector<int>& nums) {
        const int n = nums.size();
        int state = 1; // 记录峰与左元素的比较大小状态
        for (int i = 1; i < n; ++i) {
            if (nums[i - 1] <= nums[i]) { // 上升状态,更新state
                state = nums[i - 1] != nums[i]; // 如果与左值相等,则state置0,否则置1
                continue;
            }
            if (state) return i - 1; // state = 1 且 峰 > 右值,即左值 < 峰 > 右值
        }
        return state ? n - 1 : -1; // 遍历完未找到,判断state,state=1,则有峰,否则无峰
    }
};

直观想法:判断峰值需要知道 假定的这个”峰“与左右值的大小状态,使得左值 < 峰 > 右值。

具体做法:设置一个state记录”峰“与左边元素的比较大小状态,即`state = 1 if 峰 > 左值 else 0`,值得注意的是,“峰”与左值相等时,状态也要为0;state=1时,再遇到 “峰”>右值,即“峰”为真峰。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务