题目描述:
思路分析:
贪心策略:
最终题目要求摆动序列的最长子序列长度。我理解的贪心策略是:我直接从前到后,遍历一遍这个序列,只要出现一次“波动”,我的摆动序列就+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