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

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

题目名称
矩阵最小路径和

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

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

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

与汝俱进。

作者 | 谙忆
相关文章
|
7月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
319 3
|
6月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
7月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
465 2
|
7月前
|
机器学习/深度学习 传感器 算法
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
317 8
|
7月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
195 2
|
7月前
|
机器学习/深度学习 负载均衡 算法
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
396 7
|
7月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
7月前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
259 1
|
7月前
|
算法 数据可视化 异构计算
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
348 0
|
8月前
|
机器学习/深度学习 算法 数据挖掘
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
293 0

热门文章

最新文章