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

LeetCode 64. 最小路徑和 做題小結

技術標籤:Leetcode# 動態規劃動態規劃演算法leetcode資料結構

題目

給定一個包含非負整數的 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

解題思路與演算法

動態規劃:

  • 確定遞推表示式:確定遞推方程及其下標含義,dp[i][j]表示到第i行第j列的最短路徑長度 ,dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+grid[i][j];
  • dp陣列的初始化:對左上角元素初始化:dp[0][0]=grid[0][0];對第一列初始化:dp[i][0]=dp[i-1][0]+grid[i][0]; 對第一行初始化:dp[0][i]=dp[0][i-1]+grid[0][i];
  • 由遞推表示式得,順序從左向右一層一層遍歷

程式碼

class Solution {
    public int minPathSum(int[][] grid) {
		int m=grid.length;
		int 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 i=1;i<n;i++) {
			dp[0][i]=dp[0][i-1]+grid[0][i];
		}
		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];
    }
}