题解 | #寻找峰值# 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时,再遇到 “峰”>右值,即“峰”为真峰。

