1. 程式人生 > 其它 >LeetCode 64. 最小路徑和

LeetCode 64. 最小路徑和

64. 最小路徑和

Difficulty: 中等

給定一個包含非負整數的 _m_x_n_網格grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例 1:

輸入:grid = [[1,3,1],[1,5,1],[4,2,1]]
輸出:7
解釋:因為路徑 1→3→1→1→1 的總和最小。

示例 2:

輸入:grid = [[1,2,3],[4,5,6]]
輸出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

Solution

這個算是比較簡單型別的動態規劃題目了,題目要求從網格中找到一條從左上角到右下角的路徑,並且每次只能向右或者向下移動,所以到達網格中grid[i][j]只會以下幾種情況:

  1. 當i=0或j=0時,此時在網格的邊緣處,此時只能向右或者只能向下移動
  2. 當i>0且j>0時,此時不在網格的邊緣處,那麼到達grid[i][j]可以是從它的上方或者左方方向,此時我們只需要取路徑和較小的方向即可

時間複雜度O(mn),沒有使用額外的空間。

class Solution:
  def minPathSum(self, grid: List[List[int]]) -> int:
    # m 矩陣行數 n 矩陣列數
    m, n = len(grid), len(grid[0])
    if m == 0 or n == 0:
      return 0
    for i in range(m):
      for j in range(n):
        if i == 0 and j == 0:
          continue
        elif i > 0 and j == 0:
          grid[i][j] += grid[i-1][j]
        elif i == 0 and j > 0:
          grid[i][j] += grid[i][j-1]
        else:
          grid[i][j] += min(grid[i-1][j],grid[i][j-1])
    return grid[m-1][n-1]

相似題目:

LeetCode 120. 三角形最小路徑和 - swordspoet - 部落格園