Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
/*
sum[i][j]=
grid[i][j] i0 && j0 //左上角 没有移动 最小值为网格中的值
grid[i][j]+sum[i][j-1] i0 //在最上面一行,上一步为左一个,向右一步到达,最小值为到达左一个的最小值+网格中的值
grid[i][j]+sum[i-1][j] j0 //在最左边一行,上一步为由上一个,向下一步到达,最小值为到达上一个的最小值+网格中的值
Math.min(sum[i][j-1],sum[i-1][j])+grid[i][j] //上一步有两种可能,sum[i][j-1]左一个(向右一步可以到达)和sum[i-1][j]上一个(向下一步可以到达),这两种方式的最小值+网格中的值为最小值。
*/
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
if (row == 0 || col == 0)
return 0;
int[][] sum = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 && j == 0)
sum[i][j] = grid[i][j];
else if (i == 0)
sum[i][j] = grid[i][j] + sum[i][j - 1];
else if (j == 0)
sum[i][j] = grid[i][j] + sum[i - 1][j];
else
sum[i][j] = Math.min(sum[i][j - 1], sum[i - 1][j]) + grid[i][j];
}
}
return sum[row - 1][col - 1];
}
}
只能往下或者往右走,共多少中走法
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
How many possible unique paths are there?
Example 1:
Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
Input: m = 7, n = 3
Output: 28
public class Solution {
public int uniquePaths(int m, int n) {
int[][] grid = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0)
grid[i][j] = 1;//j=0在最上面一行,只能向右一直向走到达 i=0在最左边,只能向下一直走到达
else
grid[i][j] = grid[i][j - 1] + grid[i - 1][j];
//grid[i][j-1]上一个(向下一步可以到达) grid[i-1][j]左一个(向右一步可以到达)
}
}
return grid[m - 1][n - 1];
}
}
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
Note: m and n will be at most 100.
Example 1:
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] grid = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (obstacleGrid[i][j] == 1)//不能到达,直接设置为0
grid[i][j] = 0;
else {
//可以到达 分情况
if (i == 0 && j == 0)
grid[i][j] = 1;
else if (i == 0)//i=0在最上面一行,由左一个向右一步到达
grid[i][j] = grid[i][j - 1];
else if (j == 0) //j=0在最左边,由上一个向下一步到达
grid[i][j] = grid[i - 1][j];
else
grid[i][j] = grid[i][j - 1] + grid[i - 1][j];
//grid[i][j-1]左一个(向右一步可以到达) grid[i-1][j]上一个(向下一步可以到达)
}
}
}
return grid[m - 1][n - 1];
}
}