矩阵的最小路径和

寻找矩阵最小路径和的算法
这是一篇关于计算矩阵中最短路径和的问题,从左上角出发,只能向右或向下移动,直到右下角,目标是找到路径上数字之和最小的路径。例如,给定一个特定矩阵,最小路径和为12。文章可能包含解决这个问题的代码实现。

【题目】

给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。

【举例】

如果给定m:
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
路径1,3,1,6,1,0即为所求,返回12

【代码】

    public static void main(String[] args) {
        int[][] m={{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}};
        System.out.println(minPathSum(m));//12
        System.out.println(minPathSum2(m));//12

    } 

    //矩阵的最小路径和
    //方法一,时间复杂度O(M×N),空间额外复杂度O(M×N)
    public static int minPathSum(int[][] m){
        if(m==null||m.length==0||m[0]==null||m[0].length==0){
            return 0;
        }
        int row=m.length;
        int col=m[0].length;
        int[][] dp=new int[row][col];
        dp[0][0]=m[0][0];
        //生成dp第一列元素
        for(int i=1;i<row;i++){
            dp[i][0]=dp[i-1][0]+m[i][0];
        }
        //生成dp第一行元素
        for(int i=1;i<col;i++){
            dp[0][i]=dp[0][i-1]+m[0][i];
        }
        //生成dp其他元素,dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+m[i][j]
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+m[i][j];
            }
        }   
        return dp[row-1][col-1];//右下角的值
    }

    //方法二,时间复杂度O(M×N),空间额外复杂度O(min{M,N})
    public static int minPathSum2(int[][] m){
        if(m==null||m.length==0||m[0]==null||m[0].length==0){
            return 0;
        }
        int more=Math.max(m.length, m[0].length);//行数和列数较大的为more
        int less=Math.min(m.length, m[0].length);//行数和列数较小的为less
        boolean rowmore=more==m.length;//行数是否大于列数
        int[] arr=new int[less];//辅助数组的长度仅为行数与列数中的最小值
        arr[0]=m[0][0];
        for(int i=1;i<less;i++){//假设行数大于列数,则arr[i]为(0,0)到(0,i)的最小路径和
            arr[i]=arr[i-1]+(rowmore?m[0][i]:m[i][0]);
        }
        for(int i=1;i<more;i++){
            arr[0]=arr[0]+(rowmore?m[i][0]:m[0][i]);//新行的第一个元素
            for(int j=1;j<less;j++){
                arr[j]=Math.min(arr[j-1], arr[j])+//从左边过来还是从上面过来
                        (rowmore?m[i][j]:m[j][i]);
            }
        }
        return arr[less-1];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值