LeetCode高频题解:从动态规划到图算法实战

LeetCode高频题解:从动态规划到图算法实战

LeetCode是一个广受欢迎的在线编程平台,提供了大量算法和数据结构的练习题。本文将深入探讨LeetCode中的高频题目,从动态规划到图算法,通过代码示例和表格分析,帮助开发者更好地理解和应用这些算法技巧。

一、动态规划

动态规划(Dynamic Programming, DP)是一种通过把复杂问题分解为更小的子问题来求解的算法策略。它通常用于求解最优化问题。

1. 经典动态规划问题:斐波那契数列

题目描述
计算斐波那契数列的第n项。斐波那契数列的定义为:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)(n >= 2)。

代码示例(自底向上动态规划):

def fibonacci(n):
    if n <= 1:
        return n
    dp = [0] * (n + 1)
    dp[0], dp[1] = 0, 1
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[n]

print(fibonacci(10))  # 输出:55

表格示例:动态规划状态转移表(以n=5为例)

i dp[i] 计算过程
0 0 初始条件
1 1 初始条件
2 1 dp[2] = dp[1] + dp[0]
3 2 dp[3] = dp[2] + dp[1]
4 3 dp[4] = dp[3] + dp[2]
5 5 dp[5] = dp[4] + dp[3]
2. 0-1背包问题

题目描述
给定一组物品,每个物品有重量和价值,在限定的总重量内,选择物品使得总价值最大。

代码示例

def knapsack(weights, values, capacity):
    n = len(weights)
    dp = [[0] *