题目描述:取自LeetCode
第一眼看这道题,感觉有点类似于取字符串子串的题型,的确用取字符串子串的方法可以正确解出这道题,但是这道题的最后有一个进阶要求:
这样的话就需要我们想办法用一次遍历来解决这道题。
从题目中我们可以看出,摆动序列中元素的选取是可以有取舍的。比如【2,3,4,1】这个序列按照题目要求的话应该输出2,即【4,1】两个元素。而【2,3,4,3】这个序列同样为2,即【4,3】两个元素。那么我们可以看出,既然前面的2,3,4为升序,那就可以将它看成一个整体(即着重看序列中的趋势总数),取升序中的最大元素4与后面的元素比较即可,如果后面的元素小于4,则趋势发生变化,num+1。
下一个问题就是如何判断第一个趋势,如果前面有很多相同元素比如序列【1,1,1,2,4,3】,则需要在中间【1,2】的地方完成第一个趋势的判断,本程序中选择使用一个bool类型变量start来完成第一个趋势判断,即当第一次出现不同元素时确定初始趋势。
完整代码如下:
int wiggleMaxLength(vector& nums) { int num=1;//记录趋势变化次数 bool isok=true,start=false;//isok代表趋势信息(true为上升,false为下降) if(nums.size()<2)return 1; int k=nums[0]; for(int i=1;i k){ if(isok){k=nums[i];} else {k=nums[i];num++;isok=true;} } else if(nums[i] nums[i]){isok=false;num++;} else num++; i--; } } } return num; }



