zoukankan      html  css  js  c++  java
  • 376. 摆动序列

    https://leetcode-cn.com/problems/wiggle-subsequence/

    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

    例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

    给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

    //关键理清题意,非连续,可以跳过某些值。比如 1 17 5  10 13 15 10 5 16 8
    //到5 10 13 15时,其实贪心,此时放入15是能保证最长
    class Solution {
    public:
        int wiggleMaxLength(vector<int>& nums) {
            int max_length = 1;
            int len = nums.size();
            if(len < 2){
                return len;
            }
            //flag 0 1 2
            int flag = 0;
            //指定初始flag
            int k = 1;
            while(k<len){
                if(nums[k] == nums[k-1]){
                    k++;
                    continue;
                }
                if(nums[k] < nums[k-1]){
                    flag = 2;
                    max_length++;
                    break;
                }
                if(nums[k] > nums[k-1]){
                    flag = 1;
                    max_length++;
                    break;
                }
            }
            for(int i=k;i<len;i++){
                if(nums[i] == nums[i-1]){
                    //flag = 0;
                    continue;
                }
                if(nums[i] > nums[i-1] && flag != 1){
                    max_length++;
                    flag = 1;
                }
                if(nums[i] < nums[i-1] && flag != 2){
                    max_length++;
                    flag = 2;
                }
            }
            return max_length;
        }
    };

    更优的状态机

    class Solution {
    public:
        int wiggleMaxLength(vector<int>& nums) {
            if(nums.size()<2){
                return nums.size();
            }
            static const int BEGIN =0;
            static const int UP = 1;
            static const int DOWN = 2;
            int STATE = BEGIN;
            int max_length = 1;
            for(int i=1;i<nums.size();i++){
                switch(STATE){
                    case BEGIN:
                        if(nums[i] > nums[i-1]){
                            STATE = UP;
                            max_length++;
                        }else{
                            if(nums[i] < nums[i-1]){
                                STATE = DOWN;
                                max_length++;
                            }
                        }
                        break;
                    case UP:
                        if(nums[i] < nums[i-1]){
                            max_length++;
                            STATE = DOWN;
                        }
                        break;
                    case DOWN:
                        if(nums[i] > nums[i-1]){
                            max_length++;
                            STATE = UP;
                        }
                        break;
                }
            }
            return max_length;
        }
    };
    

      

  • 相关阅读:
    APB协议
    AHB总线协议(一)
    C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
    深入理解C++内存管理机制
    c/c++内存机制(一)(转)
    与临时对象的斗争(下)
    与临时对象的斗争(上)ZZ
    C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全
    qt5信息提示框QMessageBox用法
    红黑树
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/13192099.html
Copyright © 2011-2022 走看看