1、题目描述
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
例如, [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
2. 解题思路
- 当数组只有一个元素时,默认为摆动序列
- 定义up和down两个状态,当有多个元素形成连续递增时,只需选最大的那个元素,当有多个元素形成连续递减时,只需选最小的那个元素(贪心思想)。这题主要是弄清楚什么时候要转换up和down两种状态。
- 当发生转态转换时,记录元素
- 当形成递增或递减时,更新元素
3. 代码实现
class Solution:
def wiggleMaxLength(self, nums) -> int:
if(len(nums)<2):
return len(nums)
index = 0
down = False
up = False
maxSubSequence = [nums[0]]
while(index < len(nums)-1):
#当发生状态转换时,元素入list
if(up == False and nums[index + 1] - nums[index] > 0):
up = True
down = False
maxSubSequence.append(nums[index + 1])
#当状态未改变时,更新元素
elif(up == True and nums[index + 1] - nums[index] > 0):
maxSubSequence[-1] = nums[index + 1]
up = True
down = False
#当发生状态转换时,元素入list
elif(down == False and nums[index + 1] - nums[index] < 0):
down = True
up = False
maxSubSequence.append(nums[index + 1])
# 当状态未改变时,更新元素
elif(down == True and nums[index + 1] - nums[index] < 0):
maxSubSequence[-1] = nums[index + 1]
down = True
up = False
index = index + 1
return len(maxSubSequence)#可以把maxsubSequence的值打印出来看看,满足贪心算法