算法刷题
文章平均质量分 91
Cc1924
这个作者很懒,什么都没留下…
展开
-
力扣hot100——第6天:32最长有效括号、33搜索旋转排序数组、34在排序数组中查找元素的第一个和最后一个位置
参考:力扣题目链接;题解1,题解2这道题目官方的题解讲解的就非常清除了,现在摘录如下:注意:注意dp数组的定义,一定是以为结尾的字符子串,也就是必须包含。尤其注意第二种情况,也就是的时候,此时当前的无法跟匹配直接构成一个有效的字符子串,所以需要到前面去寻找,看是否有和它匹配的。所以问题就变成,我该去前面的什么位置寻找呢?肯定不能随便选一个的位置就和他匹配,因为这样会导致这个匹配的和当前的之间的字符串不一定是合法的括号字符子串。所以我们寻找之前的的前提就是先让中间的字符串是一个合法的字符子串。也就是先去考虑的原创 2022-12-03 11:36:33 · 524 阅读 · 0 评论 -
力扣hot100——第5天:22括号生成、23合并K个升序链表、31下一个排列
所以这里需要一个死循环,然后在循环里面判断当前选择的节点,如果当前没有选择到有效节点,说明所有的链表都是空了,则说明所有的链表都遍历完毕了,可以跳出循环了。其实这道题目和昨天的合并两个升序链表思路基本是相同的,只不过由于有多个链表,所以代码中寻找当前位置的最小节点的时候需要一个for循环来判断所有的节点,从而寻找一个最小的节点。这道题目是使用递归的方法来求解,因为要求解所有的括号的可能情况,所以必须使用递归的方法来收集结果,而不能使用动态规划的方法。不同的当前节点决定了它后面展开的子树也是不同的。原创 2022-12-02 23:33:00 · 492 阅读 · 0 评论 -
力扣hot100——第4天:19删除链表的倒数第N个节点、20有效的括号、21合并两个有序链表
这道题目其实很简单,因为两个链表都是已经排序好的,结果只需要同时遍历两个链表的节点,然后判断那个数值更小,然后就选择哪个节点即可。然后再继续往后遍历后面的节点。:这道题目总记得非常熟悉,实际上有一道相加两个链表的节点的题目,跟这道题目非常像。需要注意的是,这里要使用一个虚拟头节点来引导生成的链表,这样更方便编程。原创 2022-12-02 23:31:04 · 147 阅读 · 0 评论 -
力扣hot100——第3天:11盛最多水的容器、15三数之和、17电话号码的字母组合
经过上面的解释可以发现,之前移动数组的时候,移动了那个边界,就把以它为边界的所有其他数组的可能性都包括了,所以最后只需要移动左右边界就可以求得最优的解。那么按照参考题解的做法,一开始左右边界是包含整个数组的。此时我们必须要移动数组的边界了。不动,去移动右边界的话,那么不管右边界移动到什么位置,也就是不管数组长度是。不动,去移动右边界的话,那么不管右边界移动到什么位置,也就是不管数组长度是。:此时是0为左边界,但是前面第2步移动窗口的时候我们已经证明,因此当我们从当前的位置缩减数组长度的时候,一定不能把。原创 2022-12-02 23:27:08 · 664 阅读 · 0 评论 -
力扣hot100——第2天:4寻找两个正序数组的中位数、5最长回文子串、10正则表达式匹配
所以这里可以修改一下代码,只记录最终要的中间的两个数,而不用存储合并后的数组。这样可以把空间复杂度降低到O(1),但是时间复杂度仍然是O(n)。从上面的代码中可以发现,其实最后结果只用到了合并后数组的中间的一个或者两个数,并不用所有的数组元素。直接给出代码如下,思想和上一种解法其实是一样的。:力扣要求这种解法,所以是hard难度。原创 2022-11-30 19:30:52 · 410 阅读 · 0 评论 -
力扣hot100——第1天:1两数之和、2两数相加、3无重复字符的最长子串
这道题目的思路也非常简单,因为是倒序存储的数字,所以直接从尾巴的地方把两个数字相加,然后依次往后(也就是往高位)计算相加的结果即可,就是正常的加法运算。这道题要求得是子串,所以可以使用滑动窗口算法,使用左右两个指针,然后用一个哈希表存储滑窗中已经有的元素。右指针遍历到头之后,就找到了所有符合条件的(即没有重复字符)滑窗,也就找到了最终答案。首先这道题目看最后的解释,这里说的是。原创 2022-11-30 18:38:59 · 472 阅读 · 0 评论 -
代码随想录67——额外题目【动态规划】:5最长回文子串、132分割回文串II、673最长递增子序列的个数
有的代码实现是优先遍历列,然后遍历行,其实也是一个道理,都是为了保证dp[i + 1][j - 1]都是经过计算的。的子串本身就是回文串了,那么本着要求最少分割的回文串的目的出发,显然就不需要对它进行分割了,所以它的最少分割次数为0。此时就找到了递推关系,当切割点j在[0, i] 之间时候,本题是要找到最少分割次数,所以遍历j的时候要取最小的。初始化为0,在那么在递推公式中,所有数值将都是零。(注意是左闭右闭)的子串是否是回文子串,如果是。关于回文子串,两道题目题目是一定要掌握的。原创 2022-11-29 20:41:29 · 318 阅读 · 0 评论 -
代码随想录66——额外题目【回溯、贪心】:52N皇后II、649Dota2 参议院、1221分割平衡字符串
是一模一样的,只不过51那道题是求所有的棋盘摆放的方案,而本题只需要知道所有的方案的个数。其实只是在统计结果的时候操作不同而已,其他都是一样的。感觉还是不太明白,因为当前的位置的R和T,都是要优先消灭后面的R和T,这样该怎么操作。局部最优可以推出全局最优,举不出反例,那么就试试贪心。这道题目看起来好像很复杂,其实是非常简单的贪心。直接给出代码如下,和51题基本上是一样的。:从前向后遍历,只要遇到平衡子串 就统计。例如,LRLR 这本身就是平衡子串 ,:统计了最多的平衡子串。原创 2022-11-28 10:56:13 · 330 阅读 · 0 评论 -
代码随想录65——额外题目【二叉树】:129求根节点到叶节点数字之和、1382将二叉搜索树变平衡、100相同的树、116填充每个节点的下一个右侧节点指针
本题使用层序遍历是最为直观的,遍历每一行的时候,如果不是最后一个Node,则指向下一个Node;这道题目也很简单,就实现先使用中序遍历收集原来的二叉搜索树的节点值,然后重新构造一个平衡的二叉搜索树。图中cur节点为元素4,那么搭线的逻辑代码:(注意注释中操作1和操作2和图中的对应关系)是一样的,就是遍历一条路径,到了叶子节点之后就收集结果,然后进行回溯再遍历其他路径。这道题目也很简单,和之前做过的一道题目 判断一个二叉树是不是对称二叉树 是一样的。很简单,直接给出代码,具体思路去看上面的博客即可。原创 2022-11-26 19:48:59 · 482 阅读 · 0 评论 -
代码随想录64——额外题目【哈希表、字符串】:205同构字符串、1002查找常用字符、925长键按入、844比较含退格的字符串
如下图所示:最后给出代码如下,其实很简单,就是过程繁琐了一点。原创 2022-11-24 20:43:01 · 564 阅读 · 0 评论 -
代码随想录63——额外题目【链表】:234回文链表、143重排链表、141环形链表
使用数组判断回文的时候,使用双指针法,分别从前往后、从后往前遍历,判断数字是否相等即可。最直接的想法,就是把链表装成数组,然后再判断是否回文。参考:代码随想录,143重排链表;参考:代码随想录,141环形链表;原创 2022-11-23 12:20:50 · 315 阅读 · 0 评论 -
代码随想录62——额外题目【数组】:189轮转数组、724寻找数组的中心下标、922按奇偶排序数组II
但是其实可以换一个角度想,建立一个结果数组,分别分成奇数索引的空位和偶数索引的空位。首先注意不要把这道题目理解错了,其中说的左右相等的下标是不包括当前的数字的,而是不算当前数字,其左边的数字和右边的数字的和相等。这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素,这样的的时间复杂度是O(n^2)。最后给出代码如下,注意是右旋转,所以要先旋转整个字符串,再旋转子串。:上述代码就是在计算过程中,遍历到当前的下标时,直接把左边的。需要注意的是,本题还有一个小陷阱,题目输入中,原创 2022-11-22 19:51:34 · 755 阅读 · 0 评论 -
代码随想录61——额外题目【数组】:1365有多少小于当前数字的数字、941有效的山脉数组、1207独一无二的出现次数
其实就是说,在存在相同数字的时候,只有最左边的数字的索引才等于小于它的元素的个数,所以在对排序后的数组进行从后向前遍历、用hash记录的时候,相同的数字在hash表中的值一值再被复写,直到最后一次遍历到相同数字的最左边的数字,此时进行最后一次复写,留下来的也就是正确的答案。例如,数组:1 2 3 4 4 4 ,第一个数值4的下标是3,第二个数值4的下标是4了。判断是山峰,主要就是要严格的保证左边到中间,和右边到中间是递增的。这里就需要一个技巧了,在构造数组hash的时候,的功能,实际上直接使用。原创 2022-11-21 18:50:20 · 414 阅读 · 0 评论 -
代码随想录60——单调栈:84柱状图中最大的矩形
代码如下,相比接雨水的题目,可以发现还是有很多细节的地方不同,而且我感觉不同的这些地方很有可能会产生栈为空从而访问内存错误的情况啊?和昨天自己遇到的情况一样。但是这道题测试的结果却没有出现这种错误,属实奇怪。:这道题目可以说基本上没弄明白,同时这道题和昨天接雨水的题目是非常相似的,接雨水是面试经常考察的重点题目,所以回头还是要好好的再对比两道题目学习一下。这道题目直接去看代码随想录上的讲解吧,虽然说代码随想录上讲解的样子很简单,但是自己还是不太理解。原创 2022-11-19 13:00:21 · 166 阅读 · 0 评论 -
代码随想录59——单调栈:503下一个更大元素II、42接雨水
参考:代码随想录,503下一个更大元素II;力扣题目链接做本题之前建议先做 739. 每日温度 (opens new window) 和 496.下一个更大元素 I。这道题和739. 每日温度也几乎如出一辙,不同的是本题要循环数组了。相信不少同学看到这道题,就想那我直接把两个数组拼接在一起,然后使用单调栈求下一个最大值不就行了!这样思路确实是对的。注意:为什么说把两个数组拼到一起结果就是求了一个循环的数组。因为假设最后一个数字,在它前面有比他大的数字,但是如果不是循环数组,那么由于它是最后一个数字,他右边就原创 2022-11-18 19:06:20 · 495 阅读 · 0 评论 -
代码随想录58——单调栈:739每日温度、 496下一个更大元素I
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次。为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?后面关于单调栈工作原理的绘图直接去看代码随想录中的图就可以了,因为图比较多,这里就不直接给出了。单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。另外一个小的trick是,本题求得是数,而不是索引,所以在栈中直接存数值就可以了。假设栈的开口向右,则单调栈里的元素需要。原创 2022-11-17 19:15:28 · 236 阅读 · 0 评论 -
代码随想录57——动态规划:647回文子串、516最长回文子序列
的地方都是可以省略的,因为dp数组初始化都是false。才不会被初始值覆盖,因为我们取得是序列的最大长度,肯定是>=0的,所以初始化成0的话max不会被初始值覆盖。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。思路其实是差不多的,但本题要比求回文子串简单一点,因为情况少了一点。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况。如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的。,来判断了[i,j]是不是回文,那结果一定是不对的。原创 2022-11-16 20:23:59 · 394 阅读 · 0 评论 -
代码随想录56——动态规划:583两个字符串的删除操作、72编辑距离
因为最后这两个字符可能是不相等的,那么就必须进行删除其中的一些字符让他们相等。原创 2022-11-15 18:12:55 · 278 阅读 · 0 评论 -
代码随想录55——动态规划:392判断子序列、115不同的子序列
如下图所示。如果要是定义的。原创 2022-11-14 17:50:12 · 207 阅读 · 0 评论 -
代码随想录53——动态规划:1143最长公共子序列、1035不相交的线、53最大子序和
这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面):这道题感觉和昨天的题目非常相似,但是当目前的两个数字不相等的时候,为什么是取前面的最长序列的最大值,自己还不是特别明白。的了,但要有相对顺序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。那么为了在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历这个矩阵。最后给出代码如下,和昨天的题目一样,自己也是做了调整,代码中的。原创 2022-11-12 13:30:36 · 332 阅读 · 0 评论 -
代码随想录52——动态规划:300最长递增子序列、674最长连续递增序列、 718最长重复子数组
遍历到3的时候发现不是连续递增了,所以就又重新从1开始计算连续递增子序列长度了,然后到4的时候以4结尾的连续递增子序列长度变为2。所以最后的结果就是从所有的最长递增子序列中寻找一个最大的值,也就是寻找。为结尾的数组的连续递增的子序列长度 一定等于 以i为结尾的数组的连续递增的子序列长度 + 1。中的索引,由于dp数组为了方便递推公式增加了第0行和第0列,所以对应dp数组中的 索引是。结尾最长上升子序列的长度)。结尾的子序列遍历完成之后,最长的子序列就是这些子序列的最长长度中的最大值!原创 2022-11-12 12:44:24 · 317 阅读 · 0 评论 -
代码随想录51——动态规划:309最大买卖股票时机含冷冻期、714买卖股票的最大时机含手续费
由于卖出股票的后一天就是冷冻期,所以不持有股票是有三种状态的,分别是当天卖出股票导致不持有、前一天卖出股票今天是冷冻期导致不持有、前一天是冷冻期导致不持有。所以存在冷冻期之后,不持有股票的状态从原来的一个状态扩充成了三个状态,因此增加了难度。由于冷冻期的存在,导致持有股票的时候,如果说今天想新的买入,那么必须保证昨天是不持有股票的。这道题目其实就很简单了,和没有手续费的题目求动态规划的问题一模一样,就是在不持有股票如果是今天卖出的情况,减掉手续费即可。最长上升子序列是动规的经典题目,这里。原创 2022-11-10 17:43:11 · 330 阅读 · 0 评论 -
代码随想录50——动态规划: 123买卖股票的最佳时机III、188买卖股票的最佳时机IV
的时候,前面没有买入卖出操作 ,所以上一次的操作剩余的钱就是0。第0天做第一次卖出的操作,同理和第一次卖出一样,就是先原价买入,再原价卖出,所以结果就是0,即。:下面的讲解基本按照代码随想录网站上的讲解来的,但是有改动,因为代码随想录上使用的一天是。的代码,自己写的,也是可以AC的,而且按照上面的讲解思路和昨天的题目一样,更容易理解。第0天做第一次卖出的操作,就是先原价买入,再原价卖出,所以结果就是0,即。,更加好理解,而且能和昨天的两道题对应上,是一样的思路。的循环把k次的状态都写到一个循环语句中。原创 2022-11-10 16:16:51 · 359 阅读 · 0 评论 -
代码随想录49——动态规划:121买卖股票的最佳时机、122买卖股票的最佳时机II
这道题目和昨天的动态规划二叉树的题目差不多,也是dp数组有两个维度,每个维度都表示持有/不持有 或者 选择/不选择得到的最优结果。而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。在121. 买卖股票的最佳时机中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是。表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以。表示第0天不持有股票,不持有股票那么现金就是0,所以。原创 2022-11-08 22:45:51 · 404 阅读 · 0 评论 -
代码随想录48——动态规划:198打家劫舍、213打家劫舍II、337打家劫舍III
的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,那么下面我以递归三部曲为框架,其中融合动规五部曲的内容来进行讲解。注意这里用的是**“考虑”,**例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回。:今天的题目就不是背包问题了,就是普通的动态规划问题,可以看出来非常简单。最后给出本题的代码如下,其实还是比较简单的。原创 2022-11-07 23:10:47 · 248 阅读 · 0 评论 -
代码随想录46——动态规划:139单词拆分
如果要是外层for循环遍历物品,内层for遍历背包,就需要把所有的子串都预先放在一个容器里。即:外层for循环遍历物品,内层for遍历背包 或者 外层for遍历背包,内层for循环遍历物品 都是可以的。所以最终我选择的遍历顺序为:遍历背包放在外循环,将遍历物品放在内循环。题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。,表示可以拆分为一个或多个在字典中出现的单词。原创 2022-11-06 16:39:22 · 85 阅读 · 0 评论 -
代码随想录45——动态规划:70爬楼梯(进阶版)、322零钱兑换、279完全平方数
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])。此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);得到dp[j](考虑coins[i]),只有一个来源,dp[j - coins[i]](没有考虑coins[i])。dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。原创 2022-11-05 16:33:16 · 325 阅读 · 0 评论 -
代码随想录44——动态规划:完全背包理论基础、518零钱兑换II、377组合总和IV
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!dp[j] (考虑coins[i]的组合总和) 就是所有的dp[j - coins[i]](不考虑coins[i])相加。因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]。原创 2022-11-05 15:48:38 · 392 阅读 · 0 评论 -
代码随想录43——动态规划:1049最后一块石头的重量II、494目标和、474一和零
代码随想录,1049最后一块石头的重量II;力扣题目链接。原创 2022-11-05 14:50:28 · 348 阅读 · 0 评论 -
代码随想录42——动态规划:0-1背包理论基础、0-1背包滚动数组、416分割等和子集
至于背包九讲其其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。所以背包问题的理论基础重中之重是01背包,一定要理解透!leetcode上没有纯01背包的问题,都是01背包应用方面的题目,也就是需要转化为01背包问题。原创 2022-11-05 13:44:51 · 535 阅读 · 0 评论 -
代码随想录41——动态规划:343整数拆分、96不同的二叉搜索树
其实最后没有什么方法能够判断到底拆成几个的乘积最大,因为这个是没有什么规律的,所以只能用暴力的方法把所有可能拆分的结果都试出来。的拆分结果都会用到前面的数字的拆分乘积的最大值,所以显然这里遍历顺序是从前往后遍历的。循环遍历它所有可能的根节点,然后划分左右子树,当前根节点的所有二叉搜索树的个数就是。也可以理解是i的不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。的可能性之后,取所有可能中的最大值,就是当前位置n的拆分乘积最大值。循环遍历所有可能的根节点的情况,然后对于选择的某个根节点。原创 2022-10-31 21:34:42 · 260 阅读 · 0 评论 -
代码随想录39——动态规划:62不同路径、63不同路径II
障碍物的地方dp数组保持是0的话,对计算到达当前障碍物的位置有几条路径来说是没有意义的。而是对于计算下一个位置的时候,比如当前障碍物的下一行对应位置,那么肯定不能从当前障碍物位置到达了,但是代码中我们还是要相加障碍物这个位置的结果,所以让它保持是0就没问题了。第一次接触这种题目的同学可能会有点懵,这有障碍了,应该怎么算呢?中可以看出,一定是从左到右一层一层遍历,这样保证推导。62.不同路径中我们已经详细分析了没有障碍的情况,但这里需要注意一点,因为有了障碍,(i, j),只能有两个方向来推导出来,即。原创 2022-10-29 18:10:00 · 593 阅读 · 0 评论 -
代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,原创 2022-10-28 22:37:15 · 513 阅读 · 0 评论 -
代码随想录37——贪心:738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树
代码如下,其实是比较简单的。注意记录变9的位置之后,要从这个位置往后全部赋值成9,也包括最后一位。这道题目的分析挺复杂的,但是仔细看并不是很难,具体讲解看代码随想录上的讲解吧。题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历。:去看代码随想录上的解答,暂时也没看懂,不太明白。的位置虽然没有变换,但是再往前遍历的时候发生了。:得到小于等于N的最大单调递增的整数。,从前向后遍历的话,那么就把变成了。的最大的单调递增整数。原创 2022-10-27 19:25:11 · 697 阅读 · 0 评论 -
代码随想录36——贪心:435无重叠区间、763划分字母区间、56合并区间
然后遍历每一个字符去寻找一个子串,在遍历这个子串中的每一个字符的过程中,会不断更新这个子串的最远位置。前面435无重叠区间的题目使用排序右边界、然后去掉重复的左边界的解法,但是这道题里面就不能这么用!在力扣上跑一下这个代码就会发现错误在哪里,例子是当最后的一个区间是最大的区间的时候,合并结果应该就是这个最大的区间。这道题目和昨天的用箭射气球的问题是很相似的, 其实都是把所有区间进行排列,让区间之间没有相互重叠。:这道题目和之前做过的一道题比较想,也是在遍历数组的过程中不断更新边界的范围。原创 2022-10-26 19:06:09 · 279 阅读 · 0 评论 -
代码随想录35——贪心:860柠檬水找零、406根据身高重建队列、452用最少数量的箭引爆气球
此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。这道题目不是很难,但是没有弄得特别明白,直接去看代码随想录上的讲解吧。也不是很难,但是直接做也是想不出来,直接看代码随想录的讲解吧。只需要维护三种金额的数量,5,10和20。:越刷越觉得贪心的题真是没意思。原创 2022-10-25 20:05:08 · 265 阅读 · 0 评论 -
代码随想录34——贪心:1005K次取反后最大化的数组和、134加油站、135分发糖果
这道题目看代码随想录的网站上,有暴力解法和贪心算法两种解法,贪心算法又写了两种,其中一种贪心算法我感觉是比较简单的,所以下面只给出这种贪心算法的思路。此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。最后给出整体代码,知道了上面的思路之后很简答,就是注意遍历的时候的细节即可。(从右边这个加1得到的糖果数量),一个是。原创 2022-10-24 12:11:38 · 186 阅读 · 0 评论 -
代码随想录32——贪心:122买卖股票的最佳时机II、55跳跃游戏、45跳跃游戏II
如果这个范围比之前的覆盖范围大了,说明我们这次跳跃是有进步的,所以我们就把最大范围更新,然后仍然继续往下跳。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…其实看上面的图就会发现,这道题和前面的摆动序列的题目是一样的!原创 2022-10-21 21:48:03 · 1001 阅读 · 0 评论 -
代码随想录31——贪心:贪心算法理论基础、455分发饼干、376摆动序列
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。原创 2022-10-20 20:11:46 · 257 阅读 · 0 评论 -
代码随想录30——回溯:332重新安排行程、51N皇后、37解数独
如下图(2)所示,其实只需要统计我们飞行的路径中,机场的个数和机票的张数的关系,如果机场的的个数=机票的张数+1,那么说明就用完了所有的机票(只要是用完了所有的机票,自然就遍历完了所有的节点,所以其实用完所有机票才是真正的要求)解答的方法和回溯的穷举法是一样的,因为题目先给了所有的机票,也就是所有的箭头,即从哪里出发,可以飞往哪里。其实理解了上面的题目要求之后,很容易发现这个和之前的排列问题是很相似的,其实就是每次选择当前的空的所有可能,然后调用递归选择下一个空的数的选择。然后层层调用递归函数的那种选择。原创 2022-10-19 21:53:41 · 418 阅读 · 0 评论