Leetcode刷题记录——376. 摆动序列

在这里插入图片描述

我们尝试使用O(n)时间复杂度的方法完成这个任务
也就是说,对每个元素,考虑只遍历一次

我们定义一个变量res表示最长摇摆序列的长度

则当我们遍历到第i+1个元素时,我们需要考虑第i个和第i-1个的关系
于是,我们定义一个cur_state表示前两个之间的关系:
我们先找到第一个和a[0]不同的数字,
若整个list的元素的值都一样,直接返回1
若存在第二种可能值
cur_state = 1 if a[i] > a[0] else -1(注意,进入到这里 a[i]一定不等于a[0])

若如下图所示,有a[i-1]<a[i],则a[i+1]和a[i]的大小关系有三种可能(三个绿球)
若a[i+1]<a[i],如最底下的绿球,我们将res++,cur_state = -1
若a[i+1]>=a[i],如中、上两个绿球,我们continue遍历下一个
在这里插入图片描述
同理,若如下图所示,有a[i-1]>a[i],则a[i+1]和a[i]的大小关系有三种可能(三个绿球)
若a[i+1]>a[i],如最上面的绿球,我们将res++,cur_state = 1
若a[i+1]<=a[i],如中、下两个绿球,我们continue遍历下一个
在这里插入图片描述

最后返回res即可

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        length = len(nums)
        if length == 0:
            return 0
        elif length == 1:
            return 1
        cur_state = None
        index = 1
        while index < length and nums[index] == nums[index-1]:
            index += 1
        if index == length:
            return 1
        res = 2
        cur_state = 1 if nums[index] >nums[0] else -1
        for i in range(index+1,length):
            if cur_state == 1 and nums[i] < nums[i-1]:
                res += 1
                cur_state = -1
            elif cur_state == 1 and nums[i] >= nums[i-1]:
                continue
            elif cur_state == -1 and nums[i] > nums[i-1]:
                res += 1
                cur_state = 1
            elif cur_state == -1 and nums[i] <= nums[i-1]:
                continue 
        return res
发布了43 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41545780/article/details/105148138