128、【贪心算法】leetcode ——376. 摆动序列(c++版本)-爱代码爱编程
题目描述
原题链接:376. 摆动序列
解题思路
将此问题用图示方式,转化为山坡和山峰模型来研究。采用贪心算法,找到每一个小山峰,从而找到所有的小山峰即可。
对于单向上升或下降的坡,可视为一个摆动序列,对应的最长子序列长度为2。
可能会出现的坡形有三种:
- 上下坡中有平坡
- 数组首尾两端
- 单调坡度有平坡
- 全平坡
此时,数组中的数全为0,对应的最长子序列长度为1。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() <= 1) return nums.size();
// 当nums.size()≥2时,res从1开始,满足条件时则加一不满足时,则减一
int prediff = 0, curdiff= 0, res = 1;
for(int i = 0; i < nums.size() - 1; i++) {
// 记录当前峰值差
curdiff = nums[i + 1] - nums[i];
// 前一个峰值差有等于的原因是因为初值为0,只要当前与前一个有正负差异即可。
if((prediff <= 0 && curdiff > 0) || (prediff >= 0 && curdiff < 0)) {
res++;
prediff = curdiff;
}
}
return res;
}
};
参考文章:376. 摆动序列