贪心算法——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

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Elon15/article/details/128166210