贪心算法——摇摆序列

题目二.摇摆序列

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

原文地址:https://www.cnblogs.com/LaiY9/p/15124565.html