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