- 博客(53)
- 收藏
- 关注
原创 代码随想录总结
而对于难题,我会尝试着画图,将复杂的问题拆解,一步步推导。6: 经过这两个月的坚持,我已经掌握了数组、字符串、队列、链表、栈、二叉树、回溯、贪心和动态规划等内容。除此之外,他还经常鼓励我们刷蓝桥杯的题目,这表现出了他对我们学习的关心与支持。1: 刚开始学习数据结构时,我发现涉及树和图等内容的学习有些吃力,甚至觉得解LeetCode题目是一件相当艰巨的任务。3: 为了更好地提升自己的学习效果,我主动参与讨论,写总结,这让我更对题解有了更深的认识。
2024-04-01 19:10:58
307
原创 代码随想录算法训练营Day60 ||leetCode 84.柱状图中最大的矩形
这题和接雨水的题有些像,只不过此处使用的是递增栈,因为矩形的面积想要增加宽度时,需要考虑两边最低的矩形,而为了让所有数据都参加运算,需要前后补0,来弹出栈里所有元素。84.柱状图中最大的矩形。84.柱状图中最大的矩形。
2024-03-28 13:18:53
356
原创 代码随想录算法训练营Day59 ||leetCode 503.下一个更大元素II || 42. 接雨水
保持一个单调递减栈,当新来元素大于栈头元素时,便会出现两边大,中间小的凹槽。然后一直弹出栈头元素,直到不满足为止,这时候再将新元素入栈。主体代码与上一题一样,增添一个取余的操作来实现拼接数组的效果。503.下一个更大元素II。503.下一个更大元素II。
2024-03-26 22:26:30
228
2
原创 代码随想录算法训练营Day58 ||leetCode 739. 每日温度 || 496.下一个更大元素 I
因为nums1是nums2的子集,所以将num1哈希一下,然后把nums2按照上面单调栈的情况处理,只不过每一步需要判断一下,当遇到更大的值时,st.top()是否在哈希表中出现过。出现的话就保存结果。将每个温度对应的下标入栈,当遇到更大的值以后,将result[st.top()]=i-st.top(),循环执行,直到在再没有更小的值。496.下一个更大元素 I。
2024-03-25 23:08:19
286
原创 代码随想录算法训练营Day57 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离
如果不相等,dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;dp[i][j]表示第i位开始,第j位结束的字符串是否为回文串。516.最长回文子序列。
2024-03-24 23:21:22
356
原创 代码随想录算法训练营Day55 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离
如果不同,则需要增删改的操作,而增和删本质是等效的,对一个字符串删等于对另一个字符串加,所以取dp[i-1][j]和dp[i][j-1]的最小值+1。改的话则是dp[i-1][j-1]+1;如果第i位与第j位相同,那本次可以不用操作,dp[i][j]=dp[i-1][j-1]583. 两个字符串的删除操作。583. 两个字符串的删除操作。这道题的状态方程比上一题简单一些。
2024-03-23 00:19:18
486
原创 代码随想录算法训练营Day54 ||leetCode 392.判断子序列 || 115.不同的子序列
这道题初始化与状态方程都不好想,建议多看解析。双指针遍历,比较简单易懂。115.不同的子序列。
2024-03-22 23:54:10
318
原创 代码随想录算法训练营Day53 ||leetCode 1143.最长公共子序列 || 1035.不相交的线 || 53. 最大子序和动态规划
每一位的dp[i]有两个来源,分别是dp[i-1]+nums[i]和nums[i]的最大值,因此代码就好写很多。本质上是在求两个序列的最长子串的长度,如下图所示。所以代码和上一题一样,直接复制粘贴就好。这道题的难点在于递推条件的设置。53. 最大子序和 动态规划。1143.最长公共子序列。1143.最长公共子序列。1035.不相交的线。这道题难以抽象为常见题目。
2024-03-21 14:26:11
313
原创 代码随想录算法训练营Day52 ||leetCode 300.最长递增子序列 || 674. 最长连续递增序列 || 718. 最长重复子数组
674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。
2024-03-20 22:17:16
303
原创 代码随想录算法训练营Day51 ||leetCode 309.最佳买卖股票时机含冷冻期 || 714.买卖股票的最佳时机含手续费
309.最佳买卖股票时机含冷冻期。714.买卖股票的最佳时机含手续费。本质和122题一样,多加手续费而已。
2024-03-20 19:30:30
358
原创 代码随想录算法训练营Day50 ||leetCode 123.买卖股票的最佳时机III || 188.买卖股票的最佳时机IV
做完上一道题后,这道题的思路就有了,只需要把数组宽度调整为2k+1列即可,然后将本次操作与上一次操作对应即可。剩下的就是找最小的购买价格与最大的出售价格。因为股票可以买卖两次,dp数组可以这样写。123.买卖股票的最佳时机III。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。
2024-03-18 09:38:04
448
原创 代码随想录算法训练营Day48 ||leetCode 121. 买卖股票的最佳时机 || 122.买卖股票的最佳时机II
和之前打家劫舍一样,设立两个元素,一个为买股票以后,自己手头的钱,第二是卖了以后,自己手头的钱。因为我们初始积蓄为0,买完以后就会是负数。所以要选最大的负数,对应了最便宜的股票。之后要找最大的股价来卖出,这样得到最高的利润。因为可以多次购买,所以持有股票时的最少钱不再是固定的-prices[i],而是。122.买卖股票的最佳时机II。121. 买卖股票的最佳时机。
2024-03-16 08:58:48
413
原创 代码随想录算法训练营Day47 ||leetCode 198.打家劫舍 || 213.打家劫舍II || 337.打家劫舍III
设置一个数组,记录当前位置元素的两个值,一个是偷左右节点不偷自己,一个是偷自己,不偷节点,然后使用回溯,遍历所有节点。因为首尾相连,最简单的处理方法就是分两次,一次包含头元素,一次包含尾元素。写成状态方程就会了,每一时刻的状态取决于前两次的状态。213.打家劫舍II。337.打家劫舍III。
2024-03-16 08:36:16
429
原创 代码随想录算法训练营Day46 ||leetCode 139.单词拆分 || 322. 零钱兑换 || 279.完全平方数
解决方法,0-1背包多加一个遍历即可。关于多重背包,你该了解这些!
2024-03-13 22:20:10
461
原创 代码随想录算法训练营Day45 ||leetCode 70. 爬楼梯 (进阶)|| 322. 零钱兑换 || 279.完全平方数
和上一道题代码相似,不过这里不存在错误值,因为任何数都可以用1来组成,所以一定有解。本质上和leetcode377一样。
2024-03-13 22:12:20
506
原创 代码随想录算法训练营Day44 ||leetCode 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ
此处涉及到排列情况,需要先遍历大小,再遍历容量。遍历硬币和金额,累加所有可能。518. 零钱兑换 II。377. 组合总和 Ⅳ。
2024-03-13 22:03:22
469
原创 代码随想录算法训练营Day43 ||leetCode 1049. 最后一块石头的重量 II || 494. 目标和 || 474.一和零
大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。求解在一半容量的情况下,最多能装多重的石头。假设正数的总和为x,那么负数对应的正数,其对应的总和就是sum - x。所以我们要求的是 x - (sum - x) = target。这里的x,就是bagSize,也就是我们后面要求的背包容量。读取每个字符串中01个数,然后在二维DP数组中更新。1049. 最后一块石头的重量 II。1049. 最后一块石头的重量 II。416. 分割等和子集。
2024-03-11 12:42:39
455
原创 代码随想录算法训练营Day41 ||leetCode 0-1背包问题 || 416. 分割等和子集
所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);将sum/2看作背包容量,每一个数看作重量,进行遍历。如果背包恰好能装满,说明存在一个子集和为sum/2。dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。二维数组简化为一维,注意背包从大到小遍历,避免重复放入第一个物品。那么可以有两个方向推出来dp[i][j],416. 分割等和子集。
2024-03-10 23:14:49
512
原创 代码随想录算法训练营Day40 ||leetCode 343. 整数拆分 || 96.不同的二叉搜索树
最关键的递推公式其中要注意循环方式要从大到小,避免物体重复放入。
2024-03-10 22:38:26
483
原创 代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II
将障碍物及其后方的地方,dp数组初始记为0,代表这些地方无法路过。每一位的结果等于上方与左侧结果和。63. 不同路径 II。
2024-03-10 22:10:52
835
原创 代码随想录算法训练营Day38 || leetCode 509. 斐波那契数 || 70. 爬楼梯 || 746. 使用最小花费爬楼梯
动态规划和我们数电中学习的时序电路类似,某一时刻的状态不仅与当前时刻的输入有关,还与之前的状态有关,所以推导过程中我们需要模拟题目中的情况,来找到每一时刻状态间的关系。所以dp[i]=min (dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])首先小于两层的楼梯可以看作是无花费的,于是从第二层楼梯看起。状态方程为dp[i]=dp[i-1]+dp[2]仔细分析一下就会发现,此题本质也是斐波那契数列。初始状态dp[0]=0,dp[1]=1。509. 斐波那契数。由此找到关系写代码即可。
2024-03-06 22:47:08
701
原创 代码随想录算法训练营Day37 || leetCode 738.单调递增的数字 || 968.监控二叉树
理清楚思路就好写代码,只要前一位大于后一位,例如ab,那改变以后就为(a-1)9,所以纪录最靠前的那位大于下位的数减一,后面全部改为9。首先排除叶节点安装监控,所以然后情况分类,思路解决后代码就好写了。738.单调递增的数字。
2024-03-05 23:32:46
757
原创 代码随想录算法训练营Day36 || leetCode 435. 无重叠区间 || 763.划分字母区间 || 56. 合并区间
和上一道气球题类似。只不过上一道题中两个区间左右边界相等可视为一个区间,这里不可以。统计每一个字符的最远位置,然后利用双指针来确定区间。排序,更新右边界,满足题意后加入数组。435. 无重叠区间。763.划分字母区间。
2024-03-04 22:02:47
473
原创 代码随想录算法训练营Day34 || leetCode 860.柠檬水找零 || 406.根据身高重建队列 || 452. 用最少数量的箭引爆气球
贪心的思路就是,先把最没用的钱给找出去。本题中,20元没法花出去,只有10和5能找零,但10只能找零20,而5可以找零10与20,所以就想办法把10先花出去即可。之后按照收入顺序来记录钱数并选择找零。如果某次钱的数目变为负数,则说明无法找零,输出错误。将数组按照右边界排序,只有当前的最小右边界比下一个左边界大,那就只需要一箭,反之则需要两只箭,之后再更新右边界,继续判断。先根据第一项排序,然后根据第二项的大小来插入数组。452. 用最少数量的箭引爆气球。406.根据身高重建队列。
2024-03-02 22:28:15
475
原创 代码随想录算法训练营Day33 || leetCode 1005.K次取反后最大化的数组和 || 134. 加油站 || 135. 分发糖果
如果总油耗大于总花费,那一定能到终点,所以我们只要从最后一个gas[i]-cost[i]小于零的下一位开始起泡即可。如果k消耗完,那输出即可,如果剩余K为偶数,那不影响结果,反之将最小的数变负即可,这道题难度较小,思路也简单,将数组中所有数按绝对值排序后,把负数依次变正即可。1005.K次取反后最大化的数组和。左到右和右到左遍历两次。
2024-03-01 23:36:59
436
原创 代码随想录算法训练营Day32 || leetCode 122.买卖股票的最佳时机II || 55. 跳跃游戏 || 45.跳跃游戏II
本题思路比较巧妙,将n天之内的利润进行了拆分,例如P(3)-P(1)=P(3)-P(2)+P(2)-P(1),按照这个思路,将所有正数差值加起来即可。记录当前能到最大位置end与下一步的最大位置most。当移动到end处时,就需要必须走一步,此时step++。第一个if判断也可以去掉,不影响结果。判断每个位置的最大跳跃距离与当前最大距离,如果大了,就更新最大距离,直到超过最大距离。122.买卖股票的最佳时机II。122.买卖股票的最佳时机II。
2024-02-29 22:00:55
440
原创 代码随想录算法训练营Day31 || leetCode 455.分发饼干 || 376. 摆动序列 || 53. 最大子序和
记录每一位数的当前总和,只要是正数,那说明和一定会变大。如果当前为负了,说明会使后面的和变小,要去除掉。另外维护一个记录最大值的变量,最后输出即可。这道题思路比较简单,我们要用最小的饼干去喂饱别人,所以将两个数组排序遍历,只要当前小的饼干可以满足一个人,那就满足条件,不然就换大一号的饼干。贪心算法就是利用局部最优来获取全局最优的算法,需要关注的地方就在于如何确认局部最优的关系。如果数组保持递增,那中间值完全可以忽略掉,只取两边的极值。
2024-02-28 20:48:19
431
原创 代码随想录算法训练营Day30 || leetCode 332.重新安排行程 || 51. N皇后 || 37. 解数独
通过判断来确定每一行Q的放置位置,遍历所有可能。和N皇后一样,先确定判断标准,再进行回溯。今天的题目都只需要遍历树枝即可。332.重新安排行程。此题很难,我也很费解。
2024-02-27 22:47:45
415
原创 代码随想录算法训练营Day29 || leetCode 491.递增子序列 || 46.全排列 || 47.全排列 II
每一次都遍历整个数组,注意去重。
2024-02-26 22:53:43
424
原创 代码随想录算法训练营Day27 || leetCode 93.复原IP地址 || 78.子集 || 90.子集II
子集是组合,所以要求我们无重复的取值,同时与此前不同的是,此前的组合是规定了答案长度的,此处没有,所以需要我们把所有的节点都进行保存。与分割回文串的代码相近,先写出判断函数,之后以判断结果为标准,执行回溯的代码。此题中使用点的个数来决定回溯的终止,需要学习一下。使用40题组合总和II中的去重思路来写。
2024-02-24 21:23:22
587
1
原创 代码随想录算法训练营Day26 || leetCode 39. 组合总和 || 40.组合总和II || 131.分割回文串
此题和我们之前做的组合III这道题近似,那道题可以看作是只取1-9并且长度确定的数组,此题则为任意数组,但长度不确定的数组。此题的难点在于去重,学习一下此题的去重技巧。这道题比较抽象,建议代码与图相结合来理解。
2024-02-22 21:01:13
313
原创 代码随想录算法训练营Day25 || leetCode 216.组合总和III || 17.电话号码的字母组合
此题最大的难点在于数字和字母的映射,我此处是用哈希表来进行表示。此外部分仿照之前代码即可。参考昨天的题,参数范围设置为1-9,再结合此前。的写法,将目标值传入即可。17.电话号码的字母组合。216.组合总和III。
2024-02-21 23:23:25
370
原创 代码随想录算法训练营Day24 || leetCode 77 组合数
由此可以很容易的判断出,应该使用回溯递归,像处理二叉树一样来处理问题。本题按照思路,可以得到如下的树状图。回溯递归本质上是一种穷举法。
2024-02-21 15:27:01
367
原创 代码随想录算法训练营Day23 || leetCode 669. 修剪二叉搜索树 || 108.将有序数组转换为二叉搜索树 || 538.把二叉搜索树转换为累加树
按照逆后序操作,从最右构建节点,然后保留数值累加。和数组转二叉树一样,分割数组,递归操作。遍历二叉树,将所有超过范围的节点减去。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。
2024-02-19 20:44:49
564
1
原创 代码随想录算法训练营Day22 || leetCode 235. 二叉搜索树的最近公共祖先 || 701.二叉搜索树中的插入操作 || 450.删除二叉搜索树中的节点
这里我们可以利用二叉搜索数的性质,假设p<q,那此时node->val的大小一定在p和q之间,并且如果我们是从上往下遍历的话,第一次出现的地方就是我们要找的node。借用答案里的思路,不需要去重构二叉树,只需要在最后添加一个叶节点就行,可以使整个树的变化最小。这道题思路比较复杂,主要是对不同情况下删除节点的后序操作进行分类,额外注意的就是c++里需要养成delete的好习惯,及时释放内存。235. 二叉搜索树的最近公共祖先。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。
2024-02-19 12:36:31
354
1
原创 代码随想录算法训练营Day20 || leetCode 530.二叉搜索树的最小绝对差 || 501.二叉搜索树中的众数 || 236. 二叉树的最近公共祖先
以往选择众数都是按照哈希表来记录次数,对于搜索树可以简化,只关注前后两个数的关系,如果保持不变,就将计数器count加1,并时刻与最大计数比较。而结合我们之前学习过的双指针的思想,可以加以改进,即我们并不需要第二遍的数组遍历,只需要在第一遍的时候将另一个指针标记在前一位即可。此写法需要注意清空vector数组,对于不满足的情况和每一次重新引用时清空数组。避免错误结果与上一次引用结果的影响。最简单的思路为中序遍历,然后遍历数组求差值。530.二叉搜索树的最小绝对差。501.二叉搜索树中的众数。
2024-02-17 14:21:39
444
1
原创 代码随想录算法训练营Day19 || leetCode 654.最大二叉树 || 111.617.合并二叉树 || 700.二叉搜索树中的搜索 || 98.验证二叉搜索树
654.最大二叉树654.最大二叉树使用递归回溯的方法,并且可以借用之前利用前序中序数组写二叉树的方法,直接对数组nums的序号进行操作,可以减少重构数组的内存617.合并二叉树直接对root1进行操作700.二叉搜索树中的搜索首先要明白,二叉搜索树和二叉树的区别这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。此题注意先判断节点是否为NULL,再判断val的关系。后序则利用二叉搜索树的规律来找关系。
2024-02-16 16:46:32
393
1
原创 代码随想录算法训练营Day18 || leetCode 513.找树左下角的值 || 112. 路径总和 113.路径总和ii || 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历
1.使用递归回溯,来对每一条根节点到叶节点的路径求和。此答案中使用了count为0来判断是否满足要求,将求和结果转变为做差结果,这样可以在写函数时,少传入一个sum变量,可以简化一些代码。2.在上面的代码基础上修改,将bool改为合适的vector形式。之后将true与false的地方修改为合适的数组操作。1.根据后序与前序数组中根节点的位置来切割中序数组。3.将新得到的后序与前序数组中的根节点再次表示出来。2.根据切割后的中序数组大小来切割前序和后序数组。如此循环,直到数组无法再切割,说明达到了叶节点。
2024-02-15 21:47:35
417
1
原创 代码随想录算法训练营Day17 || leetCode 110.平衡二叉树 || 257. 二叉树的所有路径 || 404.左叶子之和
使用栈来储存节点,然后进行递归。由于我们需要将栈当中的数据进行遍历输出,所以此处选择数组来模拟栈比较方便。先根据左叶子节点的定义来确认左节点,然后累加。二叉树这里大部分题目都可以使用递归法。257. 二叉树的所有路径。
2024-02-14 20:29:03
442
1
原创 代码随想录算法训练营Day16 || leetCode 104.二叉树的最大深度 || 111.二叉树的最小深度 || 559.n叉树的最大深度 || 222.完全二叉树的节点个数
和二叉树深度代码一样,注意修改TreeNode为Node,以及children[i]中i的范围。104.二叉树的最大深度 111.二叉树的最小深度。这两题的答案在昨天的文章中已经写过,在此不做赘述。最简单的递归法,后续可根据二叉树性质来优化。222.完全二叉树的节点个数。559.n叉树的最大深度。
2024-02-09 22:23:02
375
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人