题目来源:https://leetcode.cn/problems/wiggle-subsequence/description/
C++题解1:使用flg标记第一个是增还是减,如果是平,则直接返回1;根据标记的flg,不断更新顶峰值和谷底值,直到最高或者最低。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int res = 1;
bool flg = true;
int len = nums.size();
if(len == 1) return 1;
int pre = nums[0];
int i = 1;
for(; i < len; i++) { // 寻找开局是上还是下
if(nums[i] - pre > 0){
pre = nums[i];
flg = true;
break;
}
else if(nums[i] - pre < 0) {
pre = nums[i];
flg = false;
break;
}
}
if(i == len) return 1; // 如果一路是平,则返回1
else res++;
for(int j = i + 1; j < len; j++) { // 符合摆动则+1,更新flg;不符合摆动,则更新峰值或者低值或者平值
if(flg && nums[j] < pre) {
res++;
flg = false;
pre = nums[j];
}
else if(!flg && nums[j] > pre) {
res++;
flg = true;
pre = nums[j];
}
else {
pre = nums[j]; // 更新峰值或者低值或者平值
}
}
return res;
}
};
C++题解2(来源代码随想录)
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
int curDiff = 0; // 当前一对差值
int preDiff = 0; // 前一对差值
int result = 1; // 记录峰值个数,序列默认序列最右边有一个峰值
for (int i = 0; i < nums.size() - 1; i++) {
curDiff = nums[i + 1] - nums[i];
// 出现峰值
if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
result++;
}
preDiff = curDiff;
}
return result;
}
};