题目:
今天的题解让我有一点点迷惑,动态规划是不是把问题复杂化了。
所以我选择了贪心算法,而且比较容易理解。
思路:
1.题目的意思无非就是需要找到一个差值正负交替的序列,并且使得这个序列最大。
2.那么,我们完全可以设置一个标志位mark,来记录当前需要找到正值差还是负值差。
3.那么思路其实就很清晰了,因为第一个元素一定是一个波峰或者是波谷,所以第一个元素一定会放进最后的序列里。那么接下来我们交替寻找序列,用nums【i】-nums【i-1】计算差值,根据>0还是<0分开处理,然后对比标识位置。
4.需要注意的是,这里我们并不会去寻找哪个值是具体的波峰,哪个值是具体的波谷。这一切都交给nums【i】-nums【i-1】的变化来决定。(因为过了波峰波谷之后,该值一定会改变)
C++代码:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n=nums.size();
int mark=0;
if(n==0)
return 0;
int length=1;
for(int i=1;i<n;i++)
{
if(nums[i]-nums[i-1]>0&&(mark==-1||mark==0))
{
mark=1;
length++;
}
else if(nums[i]-nums[i-1]<0&&(mark==1||mark==0))
{
mark=-1;
length++;
}
else continue;
}
return length;
}
};
int main()
{
vector<int> nums = {1,17,5,10,13,15,10,5,16,8};
Solution s;
int num = s.wiggleMaxLength(nums);
cout<<num;
}