给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
利用动态规划算法,很容易解决。参考代码如下,如果弄明白第63道题思想,这个就更好理解了。第63题解题步骤和解析:力扣63-不同路径Ⅱ_sunny_daily的博客-CSDN博客
package likou;
/*
* 64.最小路径和
* 题干:
* 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
* 说明:每次只能向下或者向右移动一步。
*/
public class Demo64 {
/*
* 解题思路:
* 分两种情况考虑,如果弄明白第63道题,这道题则很容易解
*/
public int minPathSum(int[][] grid) {
int rowLength = grid.length;
int columnLength = grid[0].length;
//考虑特殊情况
if(rowLength == 1 || rowLength == 1) {
int sum = 0;
for(int i=0;i<rowLength;i++) {
int[] temp = grid[i];
for(int j=0;j<columnLength;j++) {
sum +=temp[j];
}
}
return sum;
}
//[[1,3,1],[1,5,1],[4,2,1]]
int[] upArray = grid[0];
for(int k=1;k<columnLength;k++) {
upArray[k] = upArray[k-1]+upArray[k];
}
for(int i=1;i<rowLength;i++) {
int[] currentArray = grid[i];
currentArray[0] = upArray[0]+currentArray[0];
for(int j=1;j<columnLength;j++) {
currentArray[j] = Math.min(currentArray[j-1], upArray[j])+currentArray[j];
}
upArray = currentArray;
}
return upArray[columnLength-1];
}
public static void main(String args[]) {
int[][] grid = {{0}};
Demo64 demo = new Demo64();
System.out.println(demo.minPathSum(grid));
}
}