【阿里云在线编程】34.矩阵最小路径和

简介: 【阿里云在线编程】34.矩阵最小路径和

原文地址:

https://copyfuture.com/blogs-details/20200227204619876tekz555paz1j0iq

【阿里云在线编程】34.矩阵最小路径和

题目名称

矩阵最小路径和

题目地址

https://developer.aliyun.com/coding/34

题目描述

概述:

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

示例1

比如输入矩阵为

4 1 5 3
3 2 7 7
6 5 2 8
8 9 4 5


最小路径为

23

解题源码

方法一

动态规划思想:先求简单值在逐步递推求复杂值,后面的值通过前面的结果来求得。

保证每一步的最小值进行存储即可

思路:

新建一个矩阵dp(大小也是M*M),该矩阵是从上往下,从左往右记录每一步的结果的,当前的结果可以根据该矩阵上面和左边最小的值来获得

源码

public class Top34 {
    public int solution(int[][] m) {
        if(m==null){
            return 0;
        }
        if(m.length==0){
            return 0;
        }
        int[][] dp = new int[m.length][m[0].length];
        dp[0][0] = m[0][0];
        //先计算第一行
        for (int i = 1; i < m.length; i++) {
            dp[i][0] = dp[i-1][0]+m[i][0];
        }
        //计算第一列
        for (int i = 1; i < m[0].length; i++) {
            dp[0][i] = dp[0][i-1]+m[0][i];
        }
        //从上->下,左->右 计算当前位置的最小值
        for (int i = 1; i < m.length; i++) {
            for (int j = 1; j < m[0].length; j++) {
                dp[i][j] = Math.min(dp[i][j-1],dp[i-1][j]) + m[i][j];
            }
        }
        return dp[m.length-1][m[0].length-1];
    }
}


时间复杂度O(M * M),空间复杂度O(M * M)

消耗

执行用时:7ms

执行内存:9kb

方法二

baoli求解

源码

public class Top34_2 {
    public int solution(int[][] m) {
        if(m==null){
            return 0;
        }
        if(m.length==0){
            return 0;
        }
        return minPath(m,0,0);
    }
    /**
     * 暴力递归方式求解最短路径问题
     * @param array 二维数组
     * @param i  当前走到的行
     * @param j  当前走到的列
     * @return
     */
    private static int minPath(int[][] array, int i, int j){
        //当i的值为array.length - 1并且j的值为array[0].length  - 1时表示走到了右下角
        if(i == array.length - 1 && j == array[0].length  - 1){
            //走到了右下角则直接返回右下角的数值
            return array[i][j];
        }
        //当i的值为array.length - 1并且j的值不为array[0].length - 1时,只能往右走
        if(i == array.length - 1 && j != array[0].length - 1){
            return array[i][j] + minPath(array, i ,j + 1);
        }else if(i != array.length - 1 && j == array[0].length - 1){
            //当i的值不为array.length - 1并且j的值为array[0].length - 1时,只能往下走
            return array[i][j] + minPath(array, i + 1, j);
        }
        //否则既可以向下走也可以向右走,此时选取路径最短的那个
        return array[i][j] + Math.min(minPath(array, i, j + 1), minPath(array, i + 1, j));
    }
}

时间复杂度O(2^M)

消耗

执行用时:7ms

执行内存:6kb

总结

1.暴力递归求解问题的特点

  • 把问题转化为规模缩小了的同类问题的子问题
  • 有明确的不需要继续进行递归的条件
  • 有当得到了子问题的结果之后的决策过程
  • 不记录每一个子问题的解

2.动态规划求解问题的特点

  • 1.从暴力递归中来
  • 2.把每一个子问题的解记录下来,避免重复计算
  • 3.把暴力递归的过程,抽象成了状态表达
  • 4.并且存在化简状态表达,使其更加简洁的

与汝俱进

目录
相关文章
|
4月前
线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质
线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质
62 7
|
4月前
|
Java
三阶魔方公式详解及快速解法方法介绍
三阶魔方公式详解及快速解法方法介绍
|
5月前
|
算法
蓝桥题库(X图形(矩阵))
蓝桥题库(X图形(矩阵))
|
12月前
|
算法
精选算法题(2)——矩阵螺旋输出
精选算法题(2)——矩阵螺旋输出
|
算法 C++
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
|
人工智能 算法 Java
备战蓝桥杯【二维前缀和】
备战蓝桥杯【二维前缀和】
80 0
备战蓝桥杯【二维前缀和】
|
存储 人工智能 移动开发
备战蓝桥杯【一维前缀和】
备战蓝桥杯【一维前缀和】
117 0
备战蓝桥杯【一维前缀和】
|
索引
LeetCode 1337. 矩阵中战斗力最弱的 K 行
给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
133 0
|
存储 人工智能 Java
LeetCode每日一题-8:重塑矩阵
LeetCode每日一题-8:重塑矩阵