阿里云在线编程34.矩阵最小路径和
Posted 谙忆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云在线编程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
方法二
暴力求解
源码
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.并且存在化简状态表达,使其更加简洁的
与汝俱进
以上是关于阿里云在线编程34.矩阵最小路径和的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天(阿里云周赛)—最大数和最小数—day42