LeetCode高频题:从矩阵matrix的左上角,只能往右往下走,走到右下角的最小路径和是多少

LeetCode高频题:从矩阵matrix的左上角,只能往右往下走,走到右下角的最小路径和是多少?

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
在这里插入图片描述
基础知识:
【1】动态规划4种模型:暴力递归的尝试原则,如何到傻缓存dp表跟随(记忆化搜索方法),到精细化改动态规划转移方程填dp表
【2】能发动1次能力,从0列走到N-1列,走过的最大路径和是多少?


题目

从n*m的矩阵matrix的左上角,每次只能往右往下走,走到右下角n-1行,m-1列那个格子,的最小路径和是多少

matrix范围:1<=n,m<=500
matrix数据范围:0<=arri<=100
要求世间复杂度o(n*m)


一、审题

输入:
第一行两个数:n,m,表示矩阵的长宽
第二行n行每行m个数,表示矩阵的元素

输出:
最小路径和

示例1
4 4
1 3 5 9
8 1 3 4
5 6 0 1
8 8 4 0
输出
12
在这里插入图片描述


告诉你复杂度是o(nm)很明显暗示你,这是要填写动态规划的dp表,nm的表格

题目告诉你了,每次只能往右,往下走,这就是业务限制类模型的DP4模型
关于动态规划的几种尝试,我已经说了千百遍咯:
看:【1】动态规划4种模型:暴力递归的尝试原则,如何到傻缓存dp表跟随(记忆化搜索方法),到精细化改动态规划转移方程填dp表
另外,本题和这个题,很相似,这个题目是最大路径和,今天要求的是最小路径和
【2】能发动1次能力,从0列走到N-1列,走过的最大路径和是多少?

不过,【2】是经典的高难度业务限制类型的动态规划,非常不容易,你平时练习难的,遇到这种简单的题目,绝对小菜一碟

每个格子dp[i],意味着从00位置到ij位置的最小路径和

每次你这么看,因为你只能从xy格子往右,或者往下
所以ij格子,你只能从左边来,或者上面来

你看看从上面格子来的路径和是多少?up=dp[i-1][j]
你看看从左边格子来的路径和是多少?left=dp[i][j-1]

说白了看下图中ij格子的左边和上面,谁小取谁,然后加a[i][j],就是此刻dp[i][j]
在这里插入图片描述

手撕代码,你可以,我就不手撕了

当然完全可以暴力递归写代码f(i,j),来到ij格子,要去00位置,最短路径和是多少?

f的定义你知道了吗?来到ij格子,要去00位置,最短路径和是多少?

然后写暴力递归,每次只能从上面,或者左边来

(0)base case:当i=0,且j=0,说明已经到原点00le直接返回路径累加和最小为arr[0][0]
(1)非(0),来到ij,我先从左边来的路径和left,再算上面来的路径和up
(3)如果left有效,则min=left,如果up有效,则min=min(min, up)
(4)返回从我ij走的最小路径和min+arr[i][j]

主函数怎么调?
直接返回f(arr, i=N-1, j=M-1)即:从右下角去左边,去上面,最终走到00位置的最小累加和

这个解,必然超时了……

因此,你只需要将f改为记忆化搜索代码,加一个傻缓存dp表n*m个格子

dp[i][j]跟fij的定义一样,表格长啥样?直接看本文第一个解法

(0)主函数中dp全部设置1,让暴力递归f带着dp走
(1)进f,如果dpij不是-1,就返回dpij;
(2)dpij是-1,就按照f重新计算一遍,然后填入dpij,然后返回dpij

就搞定了

代码你可以手撕,我就不手撕了


总结

提示:重要经验:

1)经典的动态规划,从ij格子去00位置,或者右下角位置,这就是业务限制类模型的DP4模型
2)说实话,除了腾讯,字节,华为,阿里这些极端一线大厂之外的其他互联网大厂,基本考题,都要比你平时准备的容易的多,只不过,你要加快速度,因为1个半小时,40分钟做选择题,你只有50分钟,要做三道题,还是很困难的,所以平时不努力,临场无法应对的。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值