如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
-
例如,
[1, 7, 4, 9, 2, 5]
是一个 摆动序列 ,因为差值(6, -3, 5, -7, 3)
是正负交替出现的。 - 相反,
[1, 4, 7, 2, 5]
和[1, 7, 4, 5, 5]
不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums
,返回 nums
中作为 摆动序列 的 最长子序列的长度 。
思路:
每次选择数组中的极大值点和极小值点,再加上左右端点构成摆动序列最长子序列。
找极值点做法:左右增减性质不一样的点就是极值点,因此对于下标为i的点,若num[i]-num[i-1]和num[i+1]-num[i]异号,则i是极值点。但是存在一些特殊情况,即有些点可能相等,导致如num[i]-num[i-1]==0的情况。对于这种情况,比较好的解决办法是设置一个left变量,用于记录i左边的上升下降趋势,当num[i]-num[i-1]!=0时正常记录,等于零则不变,每次和右侧的变化趋势进行比对即可。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()==1)
return 1;
int i=0,left=0,ret=0;
while(i<nums.size()-1)
{
int right=nums[i+1]-nums[i];
if(right!=0)
{
if(left*right<=0)
ret++;
left=right;
}
i++;
}
return ret+1;
}
};