笔试算法模拟题精解之“矩阵最小路径和”

简介: 本文介绍了暴力递归求解和动态规划求解两种方法来解答这道题目。

题目名称
矩阵最小路径和

题目地址
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

动态规划求解问题的特点:

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

方法二
暴力求解。

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

暴力递归求解问题的特点:

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

与汝俱进。

作者 | 谙忆
相关文章
|
11天前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
15 4
|
8天前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
11 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
4月前
|
存储 SQL 算法
LeetCode题目113:多种算法实现 路径总和ll
LeetCode题目113:多种算法实现 路径总和ll
|
9天前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
42 0
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
47 6
|
2月前
|
算法
基于多路径路由的全局感知网络流量分配优化算法matlab仿真
本文提出一种全局感知网络流量分配优化算法,针对现代网络中多路径路由的需求,旨在均衡分配流量、减轻拥塞并提升吞吐量。算法基于网络模型G(N, M),包含N节点与M连接,并考虑K种不同优先级的流量。通过迭代调整每种流量在各路径上的分配比例,依据带宽利用率um=Σ(xm,k * dk) / cm来优化网络性能,确保高优先级流量的有效传输同时最大化利用网络资源。算法设定收敛条件以避免陷入局部最优解。
|
4月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
50 0
算法金 | 协方差、方差、标准差、协方差矩阵
|
4月前
|
存储 算法 Unix
掌握Unix路径简化:五种有效算法比较【python力扣71题】
掌握Unix路径简化:五种有效算法比较【python力扣71题】
|
4月前
|
存储 算法 机器人
路径规划的艺术:不同路径 II 的算法深掘【python力扣63题】
路径规划的艺术:不同路径 II 的算法深掘【python力扣63题】
|
4月前
|
存储 算法 数据挖掘
穿越障碍:最小路径和的高效算法比较【python力扣题64】
穿越障碍:最小路径和的高效算法比较【python力扣题64】

热门文章

最新文章