《代码随想录(Carl)》 数据结构与算法 职业素养+经验总结记录(二)

文章讲述了动态规划在解决算法问题中的应用,强调了确定dp数组、递推公式、初始化、遍历顺序和状态转移的重要性。作者提倡在提问时展现专业性,并指出面试中如何通过逐步增加题目难度来评估候选人的算法能力。文章还提到了空间优化、遍历顺序和树的遍历方法,以及股票问题和编辑距离等经典题目的解题思路。
摘要由CSDN通过智能技术生成

《代码随想录(Carl)》 数据结构与算法

二算法类题目

2.1 职业素养+经验总结

14动态规划算法设计和代码实现调试
1确定dp数组以及下标含义;
2确定递推公式
3dp数组如何初始化
4确定遍历顺序
5举例推导dp数组,把状态转移在dp数组上具体情况模拟一遍
6写代码
7代码没通过,打印dp数组,如果打印出来和自己预先模拟推导的一样,检查动规算法设计;
不一样,检查代码实现细节是否有问题。

发出这样的问题之前,其实可以⾃⼰先思考这三个问题:
1这道题⽬我举例推导dp数组了么?
2我打印dp数组的⽇志了么?
3打印出来的dp数组和我想的⼀样么?
如果这灵魂三问⾃⼰都做到了,基本上这道题⽬也就解决了。【动态规划理论基础】
15养成专业提问的好习惯。
问问题之前要有⾃⼰的思考,问题要问到点⼦上!
⼤家⼯作之后就会发现,特别是⼤⼚,问问题是⼀个专业活,是的,问问题也要体现出专业!
如果问同事很不专业的问题,同事们会懒的回答,领导也会认为你缺乏思考能⼒,这对职场发展是很不
利的。所以⼤家在刷题的时候,就锻炼⾃⼰养成专业提问的好习惯。【动态规划理论基础】
16很多动规的题⽬的递推公式其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,使用滚动数组的思想,将空间复杂度由O(n)优化到O(1)。但我不建议这样写,⾯试中能写出版本⼀就够了哈,清晰明了,如果⾯试官要求进⼀步优化空间的话,我们再去优化。因为版本⼀才能体现出动规的思想精髓,递推的状态变化。【70. 爬楼梯】
17其实⼤⼚⾯试最喜欢的问题就是这种简单题,然后慢慢变化,在⼩细节上考察候选⼈。
此时我就发现⼀个绝佳的⼤⼚⾯试题,第⼀道题就是单纯的爬楼梯,然后看候选⼈的代码实现,如果把dp[0]定义成1了,就可以发难了,为什么dp[0]⼀定要初始化为1,此时可能候选⼈就要强⾏给dp[0]应该是1找各种理由。那这就是⼀个考察点了,对dp[i]的定义理解的不深⼊。
然后可以继续发难,如果⼀步⼀个台阶,两个台阶,三个台阶,直到m个台阶,有多少种⽅法爬到n阶 楼顶。这道题⽬leetcode上并没有原题,绝对是考察候选⼈算法能⼒的绝佳好题。
这⼀连套问下来,候选⼈算法能⼒如何,⾯试官⼼⾥就有数了。【70. 爬楼梯】
18两个题目可以使⽤⼀套⽅法分析出来的,这就是⽅法论!只有掌握⽅法论并说清⼀⼆三,才能触类旁通,举⼀反三哈!【70. 爬楼梯】
19其实我选的题⽬都是有⽬的性的,就算是简单题,也是为了练习⽅法论,然后难度都是梯度上来的,⼀
环扣⼀环。难的是把题⽬按梯度排好,循序渐进,再按照统⼀⽅法论把这些都串起来。【746. 使用最小花费爬楼梯】简单题是⽤来学习⽅法论的,⽽遇到难题才体现出⽅法论的重要性!【本周⼩结(动态规划系列四)】
20可以看出我依然还是⽤动规五部曲来进⾏分析,会把题⽬的⽅⽅⾯⾯都覆盖到!
⽽且具体这五部分析是我⾃⼰平时总结的经验,找不出来第⼆个的,可能过⼀阵⼦其他题解也会有动规
五部曲了,哈哈。现在大家应该感受到方法论的重要性了。【96. 不同的二叉搜索树】
21做动态规划的题⽬,最好的过程就是⾃⼰在纸上举⼀个例⼦把对应的dp数组的数值推导⼀下,然后再动
⼿写代码!【二维dp数组01背包理论基础】
22本题看起来是⼀道简单题⽬,稍稍进阶⼀下其实就是⼀个完全背包!
如果我来⾯试的话,我就会先给候选⼈出⼀个本题原题,看其表现,如果顺利写出来,进⽽在要求每次可以爬[1 - m]个台阶应该怎么写。
顺便再考察⼀下两个for循环的嵌套顺序,为什么target放外⾯,nums放⾥⾯。
这就能考察对背包问题本质的掌握程度,候选⼈是不是刷题背公式,⼀眼就看出来了。
这么⼀连套下来,如果候选⼈都能答出来,相信任何⼀位⾯试官都是⾮常满意的。
本题代码不⻓,题⽬也很普通,但稍稍⼀进阶就可以考察完全背包,⽽且题⽬进阶的内容在leetcode上并没有原题,⼀定程度上就可以排除掉刷题党了,简直是⾯试题⽬的绝佳选择!【70. 爬楼梯】
23本周的主题其实就是背包问题中的遍历顺序!
我这⾥做⼀下总结:
求组合数:动态规划:518. 零钱兑换II
求排列数:动态规划:377. 组合总和 Ⅳ、动态规划:70. 爬楼梯进阶版(完全背包)
求最⼩数:动态规划:322. 零钱兑换、动态规划:279.完全平⽅数
此时我们就已经把完全背包的遍历顺序研究的透透的了!
【本周⼩结(动态规划系列五)】
24对于树的话,⾸先就要想到遍历⽅式,前中后序(深度优先搜索)还是层序遍历(⼴度优先搜索)。
只不过平时我们习惯了在⼀维数组或者⼆维数组上推导公式,⼀下⼦换成了树,就需要对树的遍历⽅式⾜够了解!
【337. 打家劫舍 III[树形DP]】
25从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。那么我们只需要记录当前天的dp状态和前⼀天的dp状态就可以了,可以使⽤滚动数组来节省空间。
这⾥能写出版本⼀就可以了,版本⼆虽然原理都⼀样,但是想直接写出版本⼆还是有点麻烦,容易⾃⼰
给⾃⼰找bug。
所以建议是先写出版本⼀,然后在版本⼀的基础上优化成版本⼆,⽽不是直接就写出版本⼆。
【121. 买卖股票的最佳时机】
26之前我们已经把⼒扣上股票系列的题⽬都讲过的,然后需要⼀篇股票总结,来帮⼤家⾼屋建瓴!
从买买⼀次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到⼿续费,最后再来⼀个股票⼤总
结,可以说对股票系列完美收官了。【股票问题总结篇】
27这是Carl为什么要先讲[1143.最⻓公共⼦序列]再讲本题,⼤家会发现⼀个正确的刷题顺序对算法学习是⾮
常重要的!
这也是Carl做了很多题⽬(包括ACM和⼒扣)才总结出来的规律,⼤家仔细体会⼀下哈。【1035. 不相交的线】
28动态规划之终极绝杀:编辑距离。
这道题⽬算是编辑距离的⼊⻔题⽬(从题意中确定只需要计算删除的情况,不⽤考虑增加和替换的情况。),也是动态规划解决的经典题型。
这⼀类题都是题⽬读上去感觉很复杂,模拟⼀下也发现很复杂,⽤动规分析完了也感觉很复杂,但是最
终代码却很简短。
编辑距离的题⽬最能体现出动规精髓和巧妙之处:为了避免重复求解子问题,用从下往上的顺序先计算小问题的最优解并存储下来,再以此为基础求取大问题的最优解。从上往下分析问题,从下往上求解问题。时间复杂度由回溯暴力搜索指数级TO(2n)降低到幂次级TO(n2)。【392. 判断子序列】
29编辑距离终于来了,这道题⽬如果⼤家没有了解动态规划的话,会感觉超级复杂。
编辑距离是⽤动规来解决的经典题⽬,这道题⽬看上去好像很复杂,但⽤动规可以很巧妙的算出最少编辑距离。
在整个动规的过程中,最为关键就是正确理解dp[i][j]的定义!尤其是确定递推公式和初始化中。【72. 编辑距离】
30⼼细的录友应该会发现我⽤了三道动态规划的题目⼀直为 编辑距离 这道题⽬做铺垫,最后才引出了 动态规划:72.编辑距离,Carl的良苦⽤⼼呀,你们体会到了嘛!
动态规划:72.编辑距离 终于来了,有了前⾯三道题⽬的铺垫,应该有思路了;392.判断⼦序列,115.不同的⼦序列-一个字符串可以删除操作,583.两个字符串的删除操作-两个字符串都可以删除操作,而且都只需要计算删除的情况,不⽤考虑增加和替换的情况。本题是两个字符串都可以增删改,相⽐前三道题都要复杂的多。
【编辑距离总结篇】

感谢Carl对于LeetCode中的数据结构与算法题目的系统讲解工作,可查看网页 linkhttps://programmercarl.com
linkhttps://github.com/youngyangyang04/leetcode-master 中的讲解文档。
按照类型从基础到提高循序渐进的过程选择经典题目高频面试题来讲解,大大提高了学习数据结构与算法知识和刷题效率,解决了浪费的时间主要三个问题点:1找题;2找到了不应该现阶段做的题;3没有全套的优质题解可以参考。
按照如下类型来练习:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
经过系统的知识学习和技能练习现对整个知识体系的掌握有了一个质的飞跃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值