最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
我先是使用的递归,在25个例子卡住了,原因超时,后来在自己的编译器上测试25例子时是可以出来的
public class Solution {
public static void main(String[] a){
int[][] arr=new int[][] {{3,8,6,0,5,9,9,6,3,4,0,5,7,3,9,3},{0,9,2,5,5,4,9,1,4,6,9,5,6,7,3,2},{8,2,2,3,3,3,1,6,9,1,1,6,6,2,1,9},{1,3,6,9,9,5,0,3,4,9,1,0,9,6,2,7},{8,6,2,2,1,3,0,0,7,2,7,5,4,8,4,8},{4,1,9,5,8,9,9,2,0,2,5,1,8,7,0,9},{6,2,1,7,8,1,8,5,5,7,0,2,5,7,2,1},{8,1,7,6,2,8,1,2,2,6,4,0,5,4,1,3},{9,2,1,7,6,1,4,3,8,6,5,5,3,9,7,3},{0,6,0,2,4,3,7,6,1,3,8,6,9,0,0,8},{4,3,7,2,4,3,6,4,0,3,9,5,3,6,9,3},{2,1,8,8,4,5,6,5,8,7,3,7,7,5,8,3},{0,7,6,6,1,2,0,3,5,0,8,0,8,7,4,3},{0,4,3,4,9,0,1,9,7,7,8,6,4,6,9,5},{6,5,1,9,9,2,2,7,4,2,7,2,2,3,7,2},{7,1,9,6,1,2,7,0,9,6,6,4,4,5,1,0},{3,4,9,2,8,3,1,2,6,9,7,0,2,4,2,0},{5,1,8,8,4,6,8,5,2,4,1,6,2,2,9,7}};
Solution solution=new Solution();
System.out.println(solution.minPathSum(arr));
}
public int minPathSum(int[][] grid) {
if(grid==null||(grid.length==0&&grid[0].length==0)){
return 0;
}
return test(0,0,grid);
}
public static int test(int i,int j,int[][] arr){
if(i==arr.length-1&&j==arr[0].length-1){
return arr[i][j];
}
if(i==arr.length-1){
return arr[i][j]+test(i,j+1,arr);
}
if(j==arr[0].length-1){
return arr[i][j]+test(i+1,j,arr);
}
int sum1=arr[i][j]+test(i+1,j,arr);
int sum2=arr[i][j]+test(i,j+1,arr);
return Math.min(sum1,sum2);
}
}
后来学习的动态规划:
class Solution {
public int minPathSum(int[][] grid) {
//先判断二维数组是不是空或者0
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int row=grid.length,columns=grid[0].length;
//建立一个新的数组存放到每格最小的和
int[][] dp=new int[row][columns];
//循环遍历二维数组
for(int i=0;i<row;i++){
for(int j=0;j<columns;j++){
//有几个特殊的地方 起始点,0行和0列,分别写if
if(i==0&&j==0){
dp[i][j]=grid[i][j];
continue;
}
if(i==0){
dp[i][j]=grid[i][j]+dp[i][j-1];
continue;
}
if(j==0){
dp[i][j]=grid[i][j]+dp[i-1][j];
continue;
}
//以示例为例子,中间格子大概就只有两条路可以到,一个在上面一个在左边,所以取两者最小
dp[i][j]=grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]);
}
}
return dp[row-1][columns-1];
}
}