动态规划面试
文章平均质量分 92
动态规划面试
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
结束语|在我家的后院养长颈鹿
大厂或者跨国公司带给你的不仅仅是自身的光环,更多的是实实在在的标准工作流程,解决问题的方法,与多个团队协作解决一个大项目的能力的提升。我显然处在怀疑一切的年龄,我想把自己的一些怀疑分享给你:我不相信所谓的追逐梦想的话,也不劝你去追求梦想,我希望你能把握现实,即当下。在我的电影中,常常提出这个问题,其答案对人们来说意义重大,而这也是现实的意义——现实举足轻重,你无法超越现实。身边的朋友经常问这样一个问题:“遇到困难和问题的时候,我的压力总是很大,你觉得怎样才能快速提高自己的技术水平,独当一面呢?原创 2024-01-24 17:44:33 · 355 阅读 · 0 评论 -
16|课程回顾与总结(下)
动态规划思想是如今技术面试当中特别爱考察的一类重要问题,它出现在技术面中的比重与日俱增。因此,我们有必要有针对性地攻破这一难关,特别是系统的经验总结,外加适当强度的练习。原创 2024-01-24 16:48:44 · 755 阅读 · 0 评论 -
15|课程回顾与总结(上)
当你看到这里的时候,说明你已基本学习完了我们的整个专栏。在经过一系列的课程之后,你应该已经对最难技术面试问题——动态规划,有了较为全面的认识,并且知道该如何去解决一些经典的问题和这些问题的变种。话说回来,无论你是按部就班学习完整个专栏,还是有所挑选地进行阅读,都建议你认真读完本节课和下节课的内容。就如标题所写,这两节课主要是对整个专栏的内容进行回顾与总结,会涵盖有关动态规划的重要内容。原创 2024-01-24 16:23:51 · 788 阅读 · 0 评论 -
14|面试即正义第三期:刷题指南,熟能生巧
在本节中,列出了在技术面试环节常考的高频动态规划问题。你可以根据题目的类型,难易程度,逐步推进你的“刷题”进程。就像在开头说的那样,虽然动态规划解题模板非常管用,但一定的练习还是有必要的。这里列出的题目确实比较多,但也不希望你去把每道题都解一遍。最重要的还是要掌握以及运用我们从专栏开课就给出的动态规划解题模板。学习并培养解题思路,养成思考的习惯,这才是本课最重要的目的。同时,你也可以将这节课列出的题目当作一个参考文档,它几乎就是你能看到的最全面的动态规划面试问题总结了。原创 2024-01-24 15:43:29 · 725 阅读 · 0 评论 -
13|动态规划算法设计的关键:最优子结构与状态依赖
动态规划只能应用于有最优子结构的问题。所谓最优子结构,就是指局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,就是问题能够分解成子问题来解决。最优子结构规定了子问题与原问题的关系,最终指导我们写出状态转移方程。与此同时,它还指导了具体代码实现的计算方向。在本专栏中,计算方向是最后一个提及的内容,但它却十分重要。考虑好正确的计算方向,才能写出正确的循环迭代代码。而对于计算方向的确定,我们主要看需要依赖哪些子问题,以及最终结果的存储位置就可以了。原创 2024-01-24 14:57:36 · 1124 阅读 · 0 评论 -
12|动态规划新问题2:攻破最大子数组问题
动态规划中的子数组问题看起来比较类似,但其实很多题目需要我们举一反三、灵活处理。当然这些问题都脱离不开本课结尾提到的解题模板。解决这些问题的关键在于分析出除了数组索引之外还存在什么状态参数,一旦能够找到合适的状态参数,所有的子数组问题就迎刃而解了。所以我们需要多做练习,才能熟练解决类似的子数组问题。原创 2024-01-24 14:27:05 · 919 阅读 · 0 评论 -
11|动态规划新问题1:攻破最长递增子序列问题
求解动归领域中的子序列问题,其难度的跨越比较大,有比较简单的问题,也有比较复杂的问题。但是,这些问题都脱离不开本课结尾提到的解题模板。对于解决子序列问题来说,只有两种情况需要我们考虑:1. 当原问题的输入是一个字符串或数组时,要求解子序列。那么,你可以优先考虑使用一维备忘录的解题模板和套路来寻求问题的解;2. 但如果原问题的输入是两个或以上的字符串或数组时,你就需要考虑使用高维备忘录的解题模板来解题了。原创 2024-01-24 11:12:43 · 762 阅读 · 0 评论 -
买卖股票:常见且必考的动态规划面试题
我们可以这样描述买卖股票类型的问题。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。附加条件是:1. 每次卖出股票之后 t 天内你无法进行任何交易,同时买入股票的时候会收取 c 元的交易手续费;2. 你不能同时参与多笔交易,即你必须在再次购买前出售掉之前的股票。鉴于我们刚刚已经总结了解题模版,这里就不再赘述了。原创 2024-01-24 10:19:27 · 998 阅读 · 0 评论 -
10|面试即正义第二期:常见的动态规划面试题串烧
以上就是求方案总数类型问题,以及求可行性类型问题的解法了。事实上,我们完全可以通过转化其它类型的问题,来得到求可行性类型的动态规划问题。比如说,在带障碍的路径规划中,我们求的是路径总数。但是,当我将题目改一下:问能否从起点移动到终点?这样就变成了求可行性的问题。我们依然在遵循之前给出的动态规划解题模板来求解问题。首先,根据重叠子问题、无后向性和最优子结构来确定能否用动态规划解题。然后,再确定初始化状态、状态参数,接着确定状态存储数组(即备忘录),最终写出关键的状态转移方程。原创 2024-01-24 09:46:39 · 992 阅读 · 0 评论 -
09|子序列问题:详解重要的一大类动态规划问题
类似的,我们要明确一下什么是动态规划中的子序列问题。首先,相较于子数组问题而言,子序列问题要更复杂一些。这是因为,子数组问题是连续的,而子序列问题是不连续的。比如说字符串 “I wanna keep a giraffe in my backyard” 的一种子序列就可以是 “Igbackd”。因此,你可以看到,子序列不再要求答案是一个连续的串。即便用穷举的思路求解问题,我们都不一定知道该从何下手解决。特别的,当涉及到两个数组或字符串作为输入的情况时,如果没有处理经验,真的不容易想到解法。原创 2024-01-24 09:07:32 · 1012 阅读 · 0 评论 -
08|子数组问题:从解决动归问题套路到实践解题思路
首先,我们要明确一下什么是动态规划中的子数组问题。如果一道题目给定的输入是一个数组,那么满足以下条件的问题就是动归子数组问题:1. 问题符合动归典型特征:a. 求“最”优解问题(最大值和最小值);b. 求可行性(True 或 False);c. 求方案总数。2. 题目的答案是题设数组的子数组,或者来源于子数组。所谓答案来源于子数组,举个简单例子。比如这节课要讲到的最大子数组之和的问题,我们要求的答案就是子数组每个数字相加得到的。这个答案来源于子数组,只是对子数组多做了一步加法而已。原创 2024-01-23 23:25:10 · 866 阅读 · 0 评论 -
07|完全背包:深入理解背包问题
完全背包会如何影响状态转移方程呢?显然,完全背包把问题复杂化了,曾经的我们,只需要决策当前物品放还是不放;但现在,我们需要考虑当前物品到底要放几个,才能到达最后的最优解。从状态转移方程的角度上看,在原有 0-1 背包问题的基础上,它多了一层循环遍历。我们要通过这个循环找到一个答案:那就是到底该拿多少件当前物品。因此,上述问题的结论就是,完全背包问题让状态转移方程多了一层循环迭代。如果你已经理解到这个层面,那么恭喜你,面试这一关你已经达标了,面试官应该会很满意。原创 2024-01-23 20:46:30 · 877 阅读 · 0 评论 -
06 | 0-1背包:动态规划的Hello World
现在让我们回到这节课开头提出的那个问题,那就是 0-1 背包问题中的 0 和 1 代表的到底是什么呢?其实,可以看到在整个算法计算过程中,每次我们只能做两种选择:1. 放入当前物品;2. 不放入当前物品。如果我们对这个问题稍作修改:每个物品有一定的数量(注意不止一个),同时还允许在背包中反复放入多个相同的物品,那么这个问题就变成了每个物品应该放几个。我们可以看到 0-1 背包就是这种问题的一个子集,相当于每个物品都只有 1 个的背包问题!原创 2024-01-23 18:10:39 · 830 阅读 · 0 评论 -
05|面试即正义第一期:什么样的问题应该使用动态规划?
今天,我们一起探讨了动态规划问题的本质,更准确或更加严谨地说,动态规划是一种指导我们解决问题的思想。接着我们列出了辨别一个算法问题是否该使用动态规划来解的五大特点:1. 求最优解问题(最大值和最小值);2. 求可行性(True 或 False);3. 求方案总数;4. 数据结构不可排序(Unsortable);5. 算法不可使用交换(Non-swappable)。如果面试题目出现这些特征,那么在 90% 的情况下你都能断言它就是一个动归问题。原创 2024-01-23 17:27:06 · 880 阅读 · 0 评论 -
04 | 动态规划:完美解决硬币找零
这是我第一次在课程中提出最优子结构这一概念,所以咱们先了解一下。这东西乍一听有些玄乎,什么叫子问题之间必须相互独立?举一个简单的例子,你就明白了。比如说,假设你在外卖平台购买 5 斤苹果和 3 斤香蕉。由于促销的缘故,这两种水果都有一个互相独立的促销价。如果原问题是让你以最低的价格购买这些水果,你该怎么买?显然,由于这两种水果的促销价格相互独立、互不影响,你只需直接购买就能享受到最低折扣的价格。现在我们得到了正确的结果:最低价格就是直接购买这两种折扣水果。原创 2024-01-23 16:52:56 · 2205 阅读 · 0 评论 -
03 | 备忘录:如何避免递归中的重复计算?
斐波那契数列没有求最值的问题,因此严格来说它不是最优解问题,当然也就不是动态规划问题。但它能帮助你理解什么是重叠子问题。首先,它的数学形式即递归表达是这样的:return 0;// 如果输入n有误,则返回默认值这个代码有问题吗?没问题,但是它效率极低。那么它效率低在哪里呢?假设上面的函数调用输入是 10,把递归树画出来:我们要怎么理解这个递归树呢?原创 2024-01-23 16:17:13 · 939 阅读 · 0 评论 -
02 | 暴力递归:当贪心失效了怎么办?
今天我们学习了最优化问题的本质,即从所有满足条件的组合里找出最优解的组合。贪心算法只能解决局部最优问题,而我们的最终目标是解决整体最优问题(即最优解)。自然地,枚举是获得最优解的理想方法。而递归可以帮助我们获得所有可能答案的组合。递归形式的求解几乎就是简单地把题设中的函数表达式照搬过来,它相较于迭代来说更直观,且易于理解。但暴力递归有着十分明显的缺陷,存在性能低下、可读性低和调试困难等问题。为此,我们提出了剪枝与优化这两种方法:1. 利用预设条件减少搜索路径,优化最优组合搜索方案(硬币的优化);原创 2024-01-23 15:29:54 · 937 阅读 · 0 评论 -
01 | 硬币找零问题:从贪心算法说起
硬币找零问题本质上是求最值问题。事实上,动态规划问题的一般形式就是求最值,而求最值的核心思想是穷举。这是因为只要我们能够找到所有可能的答案,从中挑选出最优的解就是算法问题的结果。在没有优化的情况下,穷举从来就不算是一个好方法。所以我带你使用了贪心算法来解题,它是一种使用局部最优思想解题的算法(即从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的速度去求得更好的解,当达到算法中的某一步不能再继续前进时,算法停止)。原创 2024-01-23 14:45:50 · 1659 阅读 · 0 评论 -
导读|动态规划问题纷繁复杂,如何系统学习和掌握它?
掌握经典的动态规划问题特别重要,因为很多问题都是从这些经典问题延伸出来的,在后面的课程中,你就会看到这一点。在你掌握了诸如背包问题、子序列问题或子数组问题之后,你就会发现这些问题都可以进行归纳总结。当然了,作为专栏,我会给出详细的经验总结,并在后续课程中的恰当时机给出严格的推导。这些经验总结在 90% 以上的情况下都是有效的,易于理解,而且十分适合用来应对面试。所以,我希望你也能在接下来的学习过程中,建立自己的经验总结,这些总结可以是基于这个专栏的经验总结之上的,也可以是你在学习的过程中发现的。原创 2024-01-23 11:55:38 · 781 阅读 · 0 评论 -
开篇词|为什么大厂都爱考动态规划?
算法对设计关键服务来说十分重要,它决定了系统的稳定性、弹性以及可扩展性。数据为媒,算法为介,而在极其重要的算法中,动态规划其实占了很大的比重。事实上,如果你平常关注大厂面试的话,你会发现,但凡是研发岗位,无论是招聘初级还是高级工程师,大厂都倾向于安排一轮或多轮专门的算法面试环节,而且在面试环节提出动态规划相关问题的这种趋势已经愈发明显。这是为什么呢?我来谈谈我的看法。先说算法这件事吧。我想请你回想一下,当处理数据结构相关的问题时,你有没有这样的经历?原创 2024-01-23 11:44:20 · 953 阅读 · 0 评论