贪心算法——LeetCode刷题——【376. 摆动序列】

题目描述:

在这里插入图片描述

思路分析:

贪心策略:

最终题目要求摆动序列的最长子序列长度。我理解的贪心策略是:我直接从前到后,遍历一遍这个序列,只要出现一次“波动”,我的摆动序列就+1。

详细实现:

(1)因为题目里面已经说了,一个元素也视为摆动序列,加之提示里面说nums数组最小长度为1。所以我们最初的结果(摆动序列的最长子序列长度)就直接设定为1。
(2)我们设定初始趋势为0
(3)从序列位置1开始,我们遍历整个序列。如果nums[i]-nums[i-1]>0(当前为上升趋势)并且之前趋势trend<=0(之前为下降趋势或者为平)
或者 nums[i] - nums[i-1] < 0(当前为下降趋势)并且之前趋势trend>=0(之前为上升趋势或者为平)
那么结果就+1。

小疑问:为什么trend<= 0?或者trend>=0?为什么要带上等于号呢?

因为我们得考虑,最初趋势设定的是0。从下标为1的元素开始判定时,得用最初的趋势判定!!!

贪心策略用在哪里呢?

我们直接从前到后遍历,有“波动”,结果+1。没有“波动”,继续往后找就行。

代码和注释:

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        # 单个元素也是摆动序列
        res = 1
        # 变化趋势,初始为0
        trend = 0
        for i in range(1, len(nums)):
            if (nums[i] - nums[i-1] > 0) and trend <= 0:
                res += 1
                # 趋势变为向上
                trend = 1
            elif (nums[i] - nums[i-1] < 0) and trend >= 0:
                res += 1
                # 趋势变为向下
                trend = -1
        
        # 返回结果
        return res

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值