【LeetCode刷题笔记-34 376:摆动序列】

题目:
在这里插入图片描述
今天的题解让我有一点点迷惑,动态规划是不是把问题复杂化了。

所以我选择了贪心算法,而且比较容易理解。

思路:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值