前言
- leetcode题目解法我只在csdn中记录一些我觉得有必要记录的,其它的请参考:github。
- 问题描述及我的解法及其相关注释和个人觉得的最优解都在代码片里,请自行查看。
- 执行用时参考图片:
code
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Author : rusi_
# 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
# 例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,
# 第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
# 给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
# 示例 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
# 需要注意的是,在子序列的定义中:[3,2]不是[1,2,3]的子序列 [2,3]是。
def wiggleMaxLength(nums):
"""
贪心 状态机解决
:return: 最大长度
"""
if len(nums) < 2:
return len(nums)
begin = "开始"
up = "递增"
down = "递减"
state = begin
max_length = 1
for i in range(1, len(nums)):
if state == begin:
if nums[i - 1] < nums[i]:
state = up
max_length += 1
elif nums[i - 1] > nums[i]:
state = down
max_length += 1
continue
if state == up:
if nums[i - 1] > nums[i]:
state = down
max_length += 1
continue
if state == down:
if nums[i - 1] < nums[i]:
state = up
max_length += 1
continue
return max_length
def wiggleMaxLength1(nums):
"""
别人的解法,感觉这种更加的巧妙,
当然阅读体验可能没我的解法好(我更喜欢这种)。
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n < 2:
return n
up = 1
down = 1
for i in range(1, n):
if nums[i] > nums[i - 1]:
up = down + 1
if nums[i] < nums[i - 1]:
down = up + 1
return max(up, down)
if __name__ == '__main__':
print(wiggleMaxLength([1, 17, 5, 10, 13, 15, 10, 5, 16, 8]))