- 分析
这道题是是个贪心的题目,如果把数组中的点在二位坐标中画出来,是一个折线,只需要计算拐点的次数就可以了,
需要注意的是代码利用了自动机的思想,比只写if else的代码可读性强
如果在面试中写出这样的代码,能体现出扎实的基本功。
- 代码
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int size = nums.size();
if(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 < 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 - 1] > nums[i]){
state = DOWN;
++max_length;
}
break;
case DOWN:
if(nums[i - 1] < nums[i]){
state = UP;
++max_length;
}
break;
}
}
return max_length;
}
};