返回
从小白到高手,LeetCode 64 题详解:最小路径问题(动态规划入门)
前端
2023-12-19 04:08:03
引言
在计算机科学领域,动态规划是一种常用的算法设计范式,它适用于求解具有重叠子问题和最优子结构的优化问题。在 LeetCode 64 题中,我们面临一个经典的最小路径问题,需要在包含非负整数的网格中找到从左上角到右下角的路径,使得路径上的数字总和为最小。
解题思路
动态规划的思想在于将大问题分解为一系列较小的子问题,并通过逐步求解子问题来获得最终答案。在最小路径问题中,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从左上角到 (i, j) 位置的最小路径总和。
根据动态规划的原则,我们可以使用以下递推公式来计算 dp[i][j]:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
其中,grid[i][j] 是网格中 (i, j) 位置的数字。
代码实现
def min_path_sum(grid):
"""
计算从左上角到右下角的最小路径总和。
参数:
grid: 包含非负整数的 m x n 网格。
返回:
最小路径总和。
"""
m, n = len(grid), len(grid[0])
dp = [[0 for _ in range(n)] for _ in range(m)]
# 初始化第一行和第一列
for i in range(m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for j in range(n):
dp[0][j] = dp[0][j-1] + grid[0][j]
# 计算其余位置的最小路径总和
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
# 返回右下角的最小路径总和
return dp[m-1][n-1]
复杂度分析
- 时间复杂度:O(m * n),其中 m 和 n 分别是网格的行数和列数。
- 空间复杂度:O(m * n),因为我们使用了一个二维数组 dp 来存储子问题的解。
结语
通过本文,我们深入分析了 LeetCode 64 题:最小路径问题,并提供了清晰易懂的动态规划解决方案。希望您能从中有所收获,并将其应用到其他类似问题中。祝您在 LeetCode 的征程中一路顺风!