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] *