• 贪心算法——摇摆序列


    题目二.摇摆序列

    一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为摇摆序列。一个小于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;
    }
    };

  • 相关阅读:
    《Unity3d-控制枪口的朝向代码》
    《Unity3D-鱼的方向 鱼的游动 控制代码》
    《unity3d-随机设置一个物体的scale的方法》
    《Unity3d-在地图中随机生成一个物体的代码》
    《Unity3D-控制检测碰撞以后触发的事件之敌人的攻击行为》
    《Unity3D-播放被打中的时候粒子的特效的代码》
    《Unity3D-敌人血条或者玩家血条控制的代码》
    《Unity3D-自动寻路功能的实现》
    Unity 行首不出现中文标点
    Unity 多级下拉菜单
  • 原文地址:https://www.cnblogs.com/LaiY9/p/15124565.html
Copyright © 2020-2023  润新知