📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 |问题 3(1)

📅  最后修改于: 2023-12-03 15:07:34.699000             🧑  作者: Mango

国际空间研究组织 - ISRO CS 2017 - 问题 3

这道题是针对动态规划的一道问题,需要从输入的数字序列中找到最长的摆动序列。

题目描述

给定一个整数序列,找到最长的摆动序列。摆动序列是交替上升和下降。一个序列如果连续数字之间的差严格地在正数和负数之间交替,则称这样的序列为摆动序列。第一个差值可能是正数或负数。少于两个元素的序列也是摆动序列。

样例输入:

10 22 9 33 49 50 31 60 40 80

样例输出:

6
思路

我们可以使用动态规划的方法解决此问题。我们将两个数组up和down分别用于存储截止到nums[i]时上升和下降的最长“摆动序列”的长度,则:

if nums[i] > nums[i-1]:
    up[i] = down[i-1] + 1
    down[i] = down[i-1]
elif nums[i] < nums[i-1]:
    down[i] = up[i-1] + 1
    up[i] = up[i-1]
else:
    down[i] = down[i-1]
    up[i] = up[i-1]

最终结果即为up和down中的最大值。

代码实现
def wiggleMaxLength(nums):
    if len(nums) < 2:
        return len(nums)
    up = [1] * len(nums)
    down = [1] * len(nums)
    for i in range(1, len(nums)):
        if nums[i] > nums[i-1]:
            up[i] = down[i-1] + 1
            down[i] = down[i-1]
        elif nums[i] < nums[i-1]:
            down[i] = up[i-1] + 1
            up[i] = up[i-1]
        else:
            down[i] = down[i-1]
            up[i] = up[i-1]
    return max(up[-1], down[-1])