题目链接:376. 摆动序列 - 力扣(LeetCode)
代码:
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {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;}
};
将整个序列抽象到坐标轴上,这里指的摆动也就是坐标轴上的极值
统计到所有极值的个数,则为答案的摆动数。
符合极值的条件:prediff和curdiff相反
但有细节处理需要注意:
-有平坡的情况:只记录一个,靠右或者靠左,引入了=的情况(靠左:curdiff == 0,靠右:prediff == 0)
-只有两个数:因为这里的判断需要三个数才能完成,i,i-1,i+1,默认prediff=0(模拟第一个数a前还有一个数a,对于后面判断,两个数就会判断成两个极值)
-单调区间有平坡:在只有摆动变化的时候更新prediff,不然prediff =0,curdiff>0的时候记录一次,中间平坡,prediff变化,prediff = 0,curdiff>0的时候记录一次,最后prediff>0,curdiff<0的时候记录一次,中间就重复了,但中间的位置实际是prediff>0,curdiff>0,由于相同数值的情况,prediff更新为0,导致这种情况也被算成了一个极值,是错误的,所以只在有摆动的地方,在记录pre