题目链接:https://leetcode-cn.com/problems/wiggle-subsequence/
题意:设摆动序列为相邻两数差值为正负交替的序列,给你一个序列,可以从中删除一些元素,求问最长摆动序列包含多少元素。
分析:设摆动序列最后一个元素为上升趋势的话,则为上升摆动序列,否则就为下降摆动序列。
可以用动态规划来解决这个问题,以上升摆动序列(up)来看状态转移:
1.nums[i]<nums[i-1]
此时up无法从down获得状态转移了(比前者小,不可能最后是上升的趋势了),直接为up[i]=up[i-1]
2.nums[i]>nums[i-1]
此时可以从down获得状态转移了,up[i]=max(up[i-1],down[i-1]+1)
对下降摆动序列同理,用滚动数组降低空间复杂度。
class Solution { public: int wiggleMaxLength(vector<int>& nums) { int n=nums.size(); while(n<2)return n; int up=1,down=1; for(int i=1;i<n;i++){ if(nums[i]<nums[i-1]){ down=max(down,up+1); } else if(nums[i]>nums[i-1])up=max(up,down+1); } return max(up,down); } };