返回

LeetCode-摆动序列:掌握动态规划技巧,纵横考题

后端

在LeetCode算法题中,摆动序列是一道经典且具有挑战性的问题。掌握摆动序列的解法,不仅能帮助您轻松应对算法面试,还能加深您对动态规划技巧的理解。

摆动序列简介

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

摆动序列的动态规划解法

摆动序列的动态规划解法是基于这样的原理:对于给定的数字序列,可以定义一个状态dp[i],表示以下标i结尾的最长摆动序列的长度。那么,对于每个元素i,我们可以通过遍历它前面的元素j,计算dp[i]。如果j满足以下条件,则dp[i] = max(dp[i], dp[j] + 1):

  • j < i
  • nums[i] > nums[j](对于上升序列)
  • nums[i] < nums[j](对于下降序列)

动态规划算法步骤

  1. 初始化dp数组,其中dp[0] = 1,表示空序列的长度为1。
  2. 对于每个元素i,遍历它前面的元素j。
  3. 如果j满足条件,则更新dp[i] = max(dp[i], dp[j] + 1)。
  4. 返回dp[n-1],其中n是序列的长度。

LeetCode题目实例

LeetCode上有许多关于摆动序列的题目,其中一道经典题是“摆动序列的长度(376)”。在这道题中,给定一个整数数组,要求返回最长摆动序列的长度。

示例:

输入:[1, 7, 4, 9, 2, 5]
输出:6
解释:最长摆动序列是[1, 7, 4, 9, 2, 5],长度为6

我们可以使用动态规划的方法来解决这道题。具体代码如下:

def wiggleMaxLength(nums):
    if not nums:
        return 0

    n = len(nums)
    dp = [1] * n

    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j] and dp[i] < dp[j] + 1:
                dp[i] = dp[j] + 1
            elif nums[i] < nums[j] and dp[i] < dp[j] + 1:
                dp[i] = dp[j] + 1

    return max(dp)

结语

摆动序列的动态规划解法是一种非常有效的算法技巧。掌握这一技巧,不仅能帮助您轻松应对LeetCode题目的解法,还能加深您对动态规划技巧的理解。通过循序渐进的讲解和生动示例,本文为您详细介绍了摆动序列及其算法技巧,无论您是LeetCode爱好者,还是算法面试候选人,本文都会助您提升技能,挑战自我,在面试中脱颖而出。