一.问题描述
一个数字序列如果连续的数字间的差值严格在正负之间交替,则被称为摆动序列。第一个差异(如果有的话)可以是
正的还是负的。少于两个元素的序列是特殊的摆动序列。比如,[1,7,4,9,2,5]是摆动序列,因为差异(6,-3,5,-7,3)正负交替。
给定一个整数序列,返回长度最长的摆动序列的子序列的长度。子序列是通过从原始序列删除一些数量的元素,留
下剩下的元素在他们的原始序列中。
二.思路
1.用一个数组来记录前后两值差值为负的长度.一个数组来记录前后两值差为正的长度
2.直接用两个变量来记录,这样更简单
三.C++代码
class Solution {
public:
int wiggleMaxLength(vector<int>& nums)
{
int size = nums.size();
if (size == 0) {
return 0;
}
vector<int> up(size, 0);
vector<int> down(size, 0);
up[0] = 1;
down[0] = 1;
for(int i=1; i<size; ++i)
{
if (nums[i] > nums[i-1])
{
up[i] = down[i-1] + 1;
down[i] = down[i-1];
}
else if (nums[i] < nums[i-1])
{
down[i] = up[i-1] + 1;
up[i] = up[i-1];
}
else
{
up[i] = up[i-1];
down[i] = down[i-1];
}
}
return max(up[size-1], down[size-1]);
}
};
下个版本更简洁:直接用两个变量代替数组,因为上述办法实际用到的只是跟随循环移动的变量,前边的并不会用到,因此可以用一个变量来代替一个数组:
<span style="font-size:18px;">class Solution {
public:
int wiggleMaxLength(vector<int>& nums)
{
int size = nums.size();
if(size == 0) return 0;
int up = 1, down = 1;
for(int i = 1; i < size; ++i)
{
if(nums[i] > nums[i-1])
{
up = down + 1;
} else if (nums[i] < nums[i-1])
{
down = up + 1;
}
}
return max(up, down);
}
};</span>