zoukankan      html  css  js  c++  java
  • 贪心算法——摇摆序列

    题目二.摇摆序列

    一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为摇摆序列。一个小于2个元素的序列直接为摇摆序列。

    例如∶

    序列【1,7,4,9,2,5】,相邻元素的差 (6,-3,5,-7,3),该序列为摇摆序列。

    序列【1,4,7,2,5】(3,3,-5,3)、【1,7,4,5,5】(6,-3,1,0)不是摇摆序列。

    给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度。

    例如∶

    输入【1,7,4,9,2,5】,结果为6;

    输入【1,17,5,10,13,15,10,5,16,8】,结果为7(【1,17,10,13,10,16,8】);

    输入【1,2,3,4,5,6,7,8,9】,结果为2。

    思路:

    将各个节点放入坐标系,并连成线,会出现递增递减的线段,其中的递增递减的转折点为符合的节点

     代码:

    class Solution {
    public:
      int wiggleMaxLength(std::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;            //摇摆序列最大长度至少为1
      for (int i = 1; i < nums.size(); i++){      //从第二个元素开始扫描
        switch(STATE){
        case BEGIN:
        if (nums[i-1] < nums[i]){
          STATE = UP;
          max_length++;
        }
        else if (nums[i-1] > nums[i]){
          STATE = DOWN;
          max_length++;
        }
         break;
        case UP:
        if (nums[i-1] > nums[i]){
          STATE = DOWN;
          max_length++;
        }
         break;
        case DOWN:
        if (nums[i-1] < nums[i]){
          STATE = UP;
          max_length++;
        }
         break;
        }
      }
      return max_length;
    }
    };

  • 相关阅读:
    如何使用pgpool failover_stream.sh自己控制选择指定的master节点
    使用pgpool管理数据库集群故障的问题
    pgpool中定义的数据库节点及pgpool支持的复制模式
    pgpool中的配置参数的定义
    pgpool-II在故障切换过程中是如何选举新主节点的
    nginx的proxy_pass路径转发规则浅析(末尾/问题)
    elasticsearch 安装配置详解
    查看ElasticSearch服务状态和结果的URL
    Elastic数据迁移方法及注意事项
    Kafka安装及部署
  • 原文地址:https://www.cnblogs.com/LaiY9/p/15124565.html
Copyright © 2011-2022 走看看