力扣算法学习(十四)

最小路径和

给定一个包含非负整数的 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];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值