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