LeetCode-Python-376. 摆动序列

647 篇文章 23 订阅

说明:给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

https://leetcode-cn.com/problems/wiggle-subsequence/

一道中等难度的贪心题。

 

示例 1:

输入: [1,7,4,9,2,5]
输出: 6 
解释: 整个序列均为摆动序列。

示例 2:

输入: [1,17,5,10,13,15,10,5,16,8]
输出: 7
解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。

示例 3:

输入: [1,2,3,4,5,6,7,8,9]
输出: 2

思路:

摆动序列说的是相邻元素的差以正负正负正负的形式交替出现,即画成图的形状为(人人人人人人人人人),所以原数组每一段连续递增和连续递减的区间上,选一个点做代表就可以,

具体选哪一个点呢?比如【1,9,2,5,7,8,3】这个数组,假设已经选了【1,9】,现在需要在下一段递增区间【2,5,7,8】里选一个数作为代表,这时根据贪心的思想,应该选最大的数,这是因为选的数字越大,选的这个数和它的的下一个数就更有可能构成递减区间,使得摆动序列的长度增加。

上述思路转换成有限状态机就是:

有限状态机

一开始状态是begin,从第二个元素开始线性扫描,如果某个元素比前一个元素大,就代表现在的状态是UP,某个元素比前一个元素小,就代表现在的状态是DOWN,当状态发生改变时,输出的结果max_length就++。

注意检查输入的边界条件。

 

class Solution(object):
    def wiggleMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        autom = {}
        max_l = 1
        state = "begin"
        for i in range(1, len(nums)):
            if state == "begin":
                if nums[i-1] < nums[i]:
                    state = "up"
                    max_l += 1
                elif nums[i-1] > nums[i]:
                    state = "down"
                    max_l += 1
                    
            elif state == "up":
                if nums[i-1] > nums[i]:
                    state = "down"
                    max_l += 1
                    
            elif state == "down":
                if nums[i-1] < nums[i]:
                    state = "up"
                    max_l += 1
                    
        return max_l
                
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值