給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。css
說明:每次只能向下或者向右移動一步。數組
示例:spa
輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋: 由於路徑 1→3→1→1→1 的總和最小。
基礎的動態規劃問題,適合理解動態規範的想法code
沒有像以前設一個行和列+1的數組,這樣更直觀些不容易犯錯blog
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<n;i++) { dp[0][i] = dp[0][i-1] + grid[0][i]; } for (int i=1;i<m;i++) { dp[i][0] = dp[i-1][0] +grid[i][0]; } for (int i=1;i<m;i++) { for (int j=1;j<n;j++) { dp[i][j] = grid[i][j] + Math.min(dp[i-1][j],dp[i][j-1]); } } return dp[m-1][n-1]; } }
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。leetcode
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。it
問總共有多少條不一樣的路徑?io
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?class
說明:m 和 n 的值均不超過 100。基礎
示例 1:
輸入: m = 3, n = 2 輸出: 3 解釋: 從左上角開始,總共有 3 條路徑能夠到達右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3 輸出: 28
與上題相似,基礎
個人:
class Solution { public int uniquePaths(int m,int n) { int[][] dp = new int[m][n]; //初始化第一行和第一列 dp[0][0] = 1; for (int i=1;i<n;i++) { dp[0][i] = 1; } for (int i=1;i<m;i++) { dp[i][0] = 1; } for (int i=1;i<m;i++) { for (int j=1;j<n;j++) { dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m-1][n-1]; } }
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。
如今考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不一樣的路徑?
網格中的障礙物和空位置分別用 1
和 0
來表示。
說明:m 和 n 的值均不超過 100。
示例 1:
輸入: [ [0,0,0], [0,1,0], [0,0,0] ] 輸出: 2 解釋: 3x3 網格的正中間有一個障礙物。 從左上角到右下角一共有 條不一樣的路徑: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右2
public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; int[][] dp = new int[m][n]; //初始化第一行和第一列 if (obstacleGrid[0][0] == 1) { dp[0][0] = 0; } else { dp[0][0] = 1; } for (int i=1;i<n;i++) { if (obstacleGrid[0][i] == 1) dp[0][i] = 0; else dp[0][i] = dp[0][i-1]; } for (int i=1;i<m;i++) { if (obstacleGrid[i][0] == 1) dp[i][0] = 0; else dp[i][0] = dp[i-1][0]; } for (int i=1;i<m;i++) { for (int j=1;j<n;j++) { if (obstacleGrid[i][j] == 1) { dp[i][j] = 0; } else { dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } } return dp[m-1][n-1]; }