20.12.16 leetcode376

题目链接: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);
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14146071.html