给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
样例
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。
样例 2:
输入: [[1,3,2]]
输出: 6
解释:
路线是: 1 -> 3 -> 2
注意事项
你在同一时间只能向下或者向右移动一步
/**
* f[i][j] 表示走到(i,j)的最小和
* <p>
* f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
*
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
public int minPathSum(int[][] grid) {
// write your code here
int m = grid.length;
if (m == 0) {
return 0;
}
int n = grid[0].length;
if (n == 0) {
return 0;
}
int[][] f = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
f[i][j] = grid[i][j];
continue;
}
int t = Integer.MAX_VALUE;
if (i > 0) {
t = Math.min(t, f[i - 1][j]);
}
if (j > 0) {
t = Math.min(t, f[i][j - 1]);
}
f[i][j] = t + grid[i][j];
}
}
return f[m - 1][n - 1];
}
/**
* f[i][j] 表示走到(i,j)的最小和
* <p>
* f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
*
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
public int minPathSum2(int[][] grid) {
// write your code here
int m = grid.length;
if (m == 0) {
return 0;
}
int n = grid[0].length;
if (n == 0) {
return 0;
}
int[][] f = new int[2][n];
int old, now = 0;
for (int i = 0; i < m; i++) {
old = now;
now = 1 - now;
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
f[now][j] = grid[i][j];
continue;
}
int t = Integer.MAX_VALUE;
if (i > 0) {
t = Math.min(t, f[old][j]);
}
if (j > 0) {
t = Math.min(t, f[now][j - 1]);
}
f[now][j] = t + grid[i][j];
}
}
return f[now][n - 1];
}
/**
* f[i][j] 表示走到(i,j)的最小和
* <p>
* f[i][j] = min{f[i-1][j],f[i][j-1]}+A[i][j]
*
* @param grid: a list of lists of integers
* @return: An integer, minimizes the sum of all numbers along its path
*/
public static int minPathSum3(int[][] grid) {
// write your code here
int m = grid.length;
if (m == 0) {
return 0;
}
int n = grid[0].length;
if (n == 0) {
return 0;
}
int[][] f = new int[m][n];
int[][] pi = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
f[i][j] = grid[i][j];
continue;
}
int t = Integer.MAX_VALUE;
if (i > 0) {
t = Math.min(t, f[i - 1][j]);
if (t == f[i - 1][j]) {
pi[i][j] = 0;
}
}
if (j > 0) {
t = Math.min(t, f[i][j - 1]);
if (t == f[i][j - 1]) {
pi[i][j] = 1;
}
}
f[i][j] = t + grid[i][j];
}
}
int[] path = new int[m + n - 1];
int x = m - 1, y = n - 1;
for (int i = 0; i < m + n - 1; i++) {
path[i] = grid[x][y];
if (pi[x][y] == 0) {
x--;
} else {
y--;
}
}
for (int i = m + n - 2; i >= 0; i--) {
System.out.println(path[i]);
}
return f[m - 1][n - 1];
}
网友评论