数字序列称为摆动序列。第一个差异(如果有的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值(6,-3,5,-7,3)交替为正负。相反,[1,4,7,2,5]和[1,7,4,5,5]不是摇摆序列,第一个序列是因为它的前两个差是正数,第二个序列是因为它的最后的差异是零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。子序列是通过从原始序列中删除一些(或不删除)元素而获得的,其余元素保持其原始顺序。示例1:输入:[1,7,4,9,2,5]输出:6解释:整个序列是一个摆动序列。示例2:输入:[1,17,5,10,13,15,10,5,16,8]输出:7解释:该序列包含多个长度为7的摆动序列,其中一个可以是[1,17,10,13,10,16,8]。例3:输入:[1,2,3,4,5,6,7,8,9]输出:2思路1(贪心解法)这道题要求从原序列中删除(或不删除)一些元素得到子序列其余元素按其原始顺序排列。相信这吓跑了很多同学。这就要求最大摆动序列也可以修改数组。如何修改?我们来分析一下。需要删除元素以达到最大摆动序列。应该删除哪些元素?使用例2例如,如图:摆动序列局部最优:删除单调斜率上的节点(不包括单调斜率两端的节点),那么这个斜率可以有两个局部峰。OverallOptimal:整个序列具有最多的局部峰值,从而产生最长的摆动序列。局部最优导致全局最优,无法给出反例,贪心试试!(为了表达方便,下面提到的峰都是指局部峰。)实际操作中,连删除操作都不需要,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组中峰的数量(相当于删除单个斜坡上的节点,然后计算长度)。然后删除单个斜坡上的节点。在这道题的代码实现中,还是有一些技巧的。比如统计峰值时,数组的最左边和最右边是最难统计的。例如序列[2,5]的波峰个数为2,如果通过统计差分计算波峰个数,则需要考虑数组最左边和最右边的特殊情况。所以对于序列[2,5],可以假设为[2,2,5],使其有一个斜率,即preDiff=0,如图:。Swingsequence1对于上面的情况,初始结果为1(默认最右边有一个peak),此时curDiff>0&&preDiff<=0,则result++(计算左边的peak),最终结果为2(峰数为2,即摆动序列的长度为2)C++代码如下(而上图就是对应的逻辑):classSolution{public:intwiggleMaxLength(vector
