我们尝试使用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