版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjingao/article/details/83927831
最小路径和(Minimum Path Sum)java_leetcode64
题干
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
解析
这是动态规划啊,找最优子结构,找动态规划方程。
由题意知:当前位置的最短路径为arr[i-1][j] 和arr[i][j-1]的最小值,那么好了,我们找个数组存放所有位置的最小值,然后使用动态规划方程找出最小值即可。sortLen[i][j] = Math.min(sortLen[i - 1][j], sortLen[i][j - 1]) + grid[i][j]
代码
public int minPathSum(int[][] grid) {
if (grid.length == 0) {
return 0;
}
int ilen = grid.length;
int jLen = grid[0].length;
int [][] sortLen = new int[ilen][jLen];
for (int i = 0; i < ilen ; i++) {
for (int j = 0; j < jLen; j++) {
if (i == 0 && j == 0) {
sortLen[i][j] = grid[i][j];
} else if (i == 0) {
sortLen[i][j] = sortLen[i][j-1] + grid[i][j];
} else if (j == 0) {
sortLen[i][j] = sortLen[i - 1][j] + grid[i][j];
} else {
sortLen[i][j] = Math.min(sortLen[i - 1][j], sortLen[i][j - 1]) + grid[i][j];
}
}
}
return sortLen[ilen-1][jLen-1];
}
所有leetcode的题的源代码在这个github仓库里:https://github.com/zhangjingao/algorithm.git