返回

掌握动态规划之摆动序列,轻松应对 LeetCode 难题!

后端

摆动序列概述

摆动序列是指连续数字之间的差严格地在正数和负数之间交替,例如:[1, 7, 4, 9, 2] 是一个摆动序列,因为相邻数字之间的差值依次为 6(正数)、-3(负数)、5(正数)、-7(负数)。

摆动序列在许多编程面试和算法竞赛中都很常见,因此掌握解决摆动序列问题的技巧非常重要。动态规划是一种解决这类问题的高效方法,它可以将问题分解成更小的子问题,然后逐步求解,最终得到最终结果。

动态规划算法步骤

动态规划解决摆动序列问题的步骤如下:

  1. 初始化: 定义一个二维数组 dp,其中 dp[i][0] 表示以下标 i 结尾的最长摆动子序列的长度,且该序列最后一个数字为正数;dp[i][1] 表示以下标 i 结尾的最长摆动子序列的长度,且该序列最后一个数字为负数。

  2. 状态转移方程: 对于数组中的每个元素 nums[i],有如下状态转移方程:

    • dp[i][0] = max(dp[i-1][0], dp[i-1][1] + 1):如果 nums[i]nums[i-1] 大,则以下标 i 结尾的最长摆动子序列的长度为 dp[i-1][1] + 1;否则,以下标 i 结尾的最长摆动子序列的长度为 dp[i-1][0]

    • dp[i][1] = max(dp[i-1][1], dp[i-1][0] + 1):如果 nums[i]nums[i-1] 小,则以下标 i 结尾的最长摆动子序列的长度为 dp[i-1][0] + 1;否则,以下标 i 结尾的最长摆动子序列的长度为 dp[i-1][1]

  3. 边界条件: dp[0][0] = 1dp[0][1] = 1

  4. 答案计算: 最终答案为 max(dp[n-1][0], dp[n-1][1]),其中 n 为数组 nums 的长度。

示例代码

以下 Python 代码展示了如何使用动态规划解决摆动序列问题:

def max_swing_subsequence(nums):
    """
    Finds the length of the longest swing subsequence in the given list of numbers.

    Args:
        nums: A list of integers.

    Returns:
        The length of the longest swing subsequence.
    """
    n = len(nums)
    if n == 0:
        return 0

    dp = [[1 for _ in range(2)] for _ in range(n)]

    for i in range(1, n):
        for j in range(2):
            if j == 0:
                dp[i][j] = max(dp[i-1][j], dp[i-1][1] + 1)
            else:
                dp[i][j] = max(dp[i-1][j], dp[i-1][0] + 1)

    return max(dp[n-1][0], dp[n-1][1])

# Example usage
nums = [1, 7, 4, 9, 2, 5]
result = max_swing_subsequence(nums)
print("The length of the longest swing subsequence is:", result)

总结

动态规划是一种解决摆动序列问题的高效方法,通过将问题分解成更小的子问题,逐步求解,最终得到最终结果。希望本文能帮助您掌握动态规划解决摆动序列问题的方法,并轻松应对 LeetCode 难题。