LeetCode64 最小路径和
题目描述
给定一个包含非负整数的 *m* x *n*
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
**说明:**每次只能向下或者向右移动一步。
思路
动态规划思想
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])
当然第一行第一列需要分开算
用文字描述就是,第i,j位置和该位置上面和该位置左边的第一个数有关
代码实现
public class LeetCode64 {
public static void main(String[] args) {
int [][]grid= {{1,2,3},{4,5,6}};
LeetCode64 lc64=new LeetCode64();
System.out.println(lc64.minPathSum(grid));
}
public int minPathSum(int[][] grid) {
for(int i=1;i<grid[0].length;i++) {
grid[0][i]=grid[0][i-1]+grid[0][i];
}
for(int i=1;i<grid.length;i++) {
grid[i][0]=grid[i-1][0]+grid[i][0];
}
for(int i=1;i<grid.length;i++) {
for(int j=1;j<grid[0].length;j++) {
grid[i][j]=grid[i][j]+Math.min(grid[i-1][j], grid[i][j-1]);
}
}
for(int i=0;i<grid.length;i++) {
for(int j=0;j<grid[0].length;j++) {
System.out.println(grid[i][j]);
}
}
return grid[grid.length-1][grid[0].length-1];
}
}
通过
在原有的数组上操作,内存消耗少
动态规划:动态规划的思想就是,依据前面已经有的数据作选择
动态规划是递归的进化,对递归树进行剪枝