主页 > 电脑硬件  > 

每日一题——376.摆动序列

每日一题——376.摆动序列

题目链接: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

标签:

每日一题——376.摆动序列由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“每日一题——376.摆动序列