当前位置:实例文章 » 其他实例» [文章]LeetCode·每日一题·931. 下降路径最小和·记忆化搜索

LeetCode·每日一题·931. 下降路径最小和·记忆化搜索

发布人:shili8 发布时间:2024-11-16 10:19 阅读次数:0

**下降路径最小和**

**记忆化搜索**

**问题描述**

给定一个由 `n x n` 矩阵组成的网格,其中每个单元格都有一个整数值。从左上角开始,向右或向下移动一步到达右下角。找到从左上角到右下角的最短路径和。

**示例**

* 输入: `[[1,2,3],[4,5,6],[7,8,9]]`
输出:`12`

* 输入: `[[1,3,5],[2,6,9],[3,6,9]]`
输出:`21`

**解决方案**

我们将使用记忆化搜索来解决这个问题。记忆化搜索是一种优化的递归算法,通过存储已经计算过的结果来避免重复计算。

class Solution:
 def minFallingPathSum(self, matrix):
 n = len(matrix)
 # 初始化 memoization 表格 memo = [[-1 for _ in range(n)] for _ in range(n)]
 def dfs(i, j):
 # 如果结果已经计算过,则直接返回 if memo[i][j] != -1:
 return memo[i][j]
 # 如果是第一行,则只考虑向右移动 if i ==0:
 memo[i][j] = matrix[i][j] + min(dfs(i, j+1), dfs(i, j-1))
 return memo[i][j]
 # 如果是最后一行,则只考虑向左移动 elif i == n -1:
 memo[i][j] = matrix[i][j] + min(dfs(i, j+1), dfs(i, j-1))
 return memo[i][j]
 # 否则,考虑向右和向左移动 else:
 memo[i][j] = matrix[i][j] + min(min(dfs(i+1, j+1), dfs(i+1, j)), min(dfs(i+1, j-1), dfs(i+1, j)))
 return memo[i][j]
 # 初始化结果表格 result = [[0 for _ in range(n)] for _ in range(n)]
 # 计算每个单元格的最小路径和 for i in range(n):
 for j in range(n):
 result[i][j] = dfs(i, j)
 # 返回最小路径和 return min(result[n-1])


**注释**

* `memo` 表格用于存储已经计算过的结果。
* `dfs` 函数用于递归地计算每个单元格的最小路径和。
* `result` 表格用于存储每个单元格的最小路径和。

**时间复杂度**

* 时间复杂度为 O(n^2),其中 n 是网格的大小。

**空间复杂度**

* 空间复杂度为 O(n^2),其中 n 是网格的大小。

其他信息

其他资源

Top