算法描述
给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
注意事项
你在同一时间只能向下或者向右移动一步
示例01
输入:[[1,3,1],[1,5,1],[4,2,1]]
输出:7
路线:1 -> 3 -> 1 -> 1 -> 1
示例02
输入:[[1,3,2]]
输出:6
路线:1 -> 3 ->2
思路
典型的动态规划算法,可以采用空间换时间的方式提高效率。
用Java实现,代码如下:
public class Solution {
/**
* @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) {
int row = grid.length;
int cos = grid[0].length;
int[][] result = new int[row][cos];
result[0][0] = grid[0][0];
for (int i = 1; i < cos; i++) {
result[0][i] = grid[0][i] + result[0][i - 1];
}
for (int i = 1; i < row; i++) {
result[i][0] = grid[i][0] + result[i - 1][0];
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < cos; j++) {
result[i][j] = Math.min(result[i - 1][j] + grid[i][j], result[i][j - 1] + grid[i][j]);
}
}
return result[row - 1][cos - 1];
}
}