1. 题⽬链接:376.摆动序列
2. 题⽬描述
3. 解法(贪⼼):
贪⼼策略:
对于某⼀个位置来说:
◦ 如果接下来呈现上升趋势的话,我们让其上升到波峰的位置;
◦ 如果接下来呈现下降趋势的话,我们让其下降到波⾕的位置。
因此,如果把整个数组放在「折线图」中,我们统计出所有的波峰以及波⾕的个数即可。
C++算法代码:
class Solution
{
public:
int wiggleMaxLength(vector<int>& nums)
{
//边界条件
if(nums.size()<2)
{
return nums.size();
}
//count记录摆动子序列长度,left记录上一个波动状态,right记录目前的波动状态
int count=0,left=0,right=0;
for(int i=0;i<nums.size()-1;i++)
{
right=nums[i+1]-nums[i];
//无波动时跳过
if(right==0)
{
continue;
}
//存在波峰波谷时加1
if(right*left<=0)
{
count++;
}
//传递状态
left=right;
}
//最右边的点也需要加上,故返回count+1
return count+1;
}
};
Java算法代码:
class Solution
{
public int wiggleMaxLength(int[] nums)
{
int n = nums.length;
if (n < 2) return n;
int ret = 0, left = 0;
for (int i = 0; i < n - 1; i++)
{
int right = nums[i + 1] - nums[i]; // 计算接下来的趋势
if (right == 0) continue; // 如果⽔平,直接跳过
if (left * right <= 0) ret++; // 累加波峰或者波⾕
left = right;
}
return ret + 1;
}
}