首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 筆記:Minimum Path Sum - 矩陣最小路徑和

     編輯:關於C++

題目描述

給定 m×n 非負整數矩陣,從左上角走到右下角,每步只能向右或向下,求路徑上數字和的最小值。

動態規劃:標準二維 DP

dp[i][j]:走到 (i,j) 的最小路徑和。
轉移:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
邊界:首行只能從左來,首列只能從上來。

代碼 (C++ / Java / Python)

class Solution {
public:
    int minPathSum(vector>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector> dp(m, vector(n));
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; ++i) dp[i][0] = dp[i-1][0] + grid[i][0];
        for (int j = 1; j < n; ++j) dp[0][j] = dp[0][j-1] + grid[0][j];
        for (int i = 1; i < m; ++i)
            for (int j = 1; j < n; ++j)
                dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
        return dp[m-1][n-1];
    }
};
public class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; ++i) dp[i][0] = dp[i-1][0] + grid[i][0];
        for (int j = 1; j < n; ++j) dp[0][j] = dp[0][j-1] + grid[0][j];
        for (int i = 1; i < m; ++i)
            for (int j = 1; j < n; ++j)
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
        return dp[m-1][n-1];
    }
}
class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        dp = [[0]*n for _ in range(m)]
        dp[0][0] = grid[0][0]
        for i in range(1, m): dp[i][0] = dp[i-1][0] + grid[i][0]
        for j in range(1, 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[-1][-1]

空間優化:一維滾動數組 / 原地修改

  • 一維 dp[n]:逐行更新,dp[j] = min(dp[j], dp[j-1]) + grid[i][j]。
  • 原地修改 grid:grid[i][j] += min(grid[i-1][j], grid[i][j-1]),無額外空間(若允許修改輸入)。

複雜度

  • 時間:O(m·n)
  • 空間:O(m·n) / O(n) / O(1)

總結

最小路徑和是二維 DP 入門必修題。狀態定義直觀、轉移方程對稱、邊界處理簡單。面試時寫出二維版講清邏輯,再現場優化至一維或原地修改,展示空間優化技巧。可延伸至「帶障礙物」、「三方向移動」、「路徑計數」等變體。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved