自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 代码随想录算法训练营第64天|单调栈part03|84.柱状图中最大的矩形

除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解42. 接雨水 (opens new window)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。

2023-08-17 20:56:42 712

原创 代码随想录算法训练营第63天|单调栈part02|503.下一个更大元素II、 42. 接雨水

思路:如何处理循环数组相信不少同学看到这道题,就想那我直接把两个数组拼接在一起,然后使用单调栈求下一个最大值不就行了!确实可以!将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。代码:python。

2023-08-17 20:38:09 138

原创 代码随想录算法训练营第62天|单调栈part01|739. 每日温度、 496.下一个更大元素 I

思路:那有同学就问了,我怎么能想到用单调栈呢?什么时候用单调栈呢?例如本题其实就是找找到一个元素右边第一个比自己大的元素,此时就应该想到用单调栈了。,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。单调栈里存放元素的下标i注意以下讲解中,顺序的描述为。

2023-08-17 13:48:12 109

原创 代码随想录算法训练营第60天|动态规划part17| 647. 回文子串、516.最长回文子序列、动态规划总结篇

动态规划总结篇。

2023-08-16 19:19:50 241

原创 代码随想录算法训练营第59天|动态规划part16|583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

链接。

2023-08-16 12:48:39 55

原创 代码随想录算法训练营第58天|动态规划part15|392.判断子序列、115.不同的子序列

思路:(这道题也可以用双指针的思路来实现,时间复杂度也是O(n))这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。所以掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础。dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。注意这里是判断s是否为t的子序列。即t的长度是大于等于s的。

2023-08-15 20:41:03 531

原创 代码随想录算法训练营第56天|动态规划part13|300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组

思路:dp[i]表示前序列的最大递增子序列dp[i] = nums[i]大于 nums[0-(i-1)]中的dp[0-(i-1)]最大的值 + 1代码:python动规五部曲dp[i]表示i之前包括i的的最长递增子序列的长度位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.

2023-08-12 20:20:06 102

原创 代码随想录算法训练营第55天|动态规划part12|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结

总结。

2023-08-12 17:01:48 124

原创 代码随想录算法训练营第53天|动态规划part11|123. 买卖股票的最佳时机 III、188.买卖股票的最佳时机IV

思路:相比买股票的最佳时机II,限制了买股票的次数,最多只能有两次。关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。一天一共就有五个状态,dp[i][j]中 i表示第i天,,dp[i][j]表示第i天状态j所剩最大现金。需要注意:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区。例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。

2023-08-11 20:51:10 88

原创 代码随想录算法训练营第52天|动态规划part10|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

思路:贪心因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。时间复杂度:O(n)空间复杂度:O(1)动态规划dp[i][0] 表示第i天持有股票所得最多现金 ,这里可能有同学疑惑,本题中只能买卖一次,持有股票之后哪还有现金呢?其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数。dp[i][1] 表示第i天不持有股票所得最多现金注意这里说的是“持有”,“持有”不代表就是当天“买入”!

2023-08-08 21:57:18 88

原创 代码随想录算法训练营第51天|动态规划part09|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

思路:仔细一想,所以这里就更感觉到,当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。

2023-08-07 20:54:38 264

原创 代码随想录算法训练营第50天|动态规划part08|139.单词拆分、关于多重背包,你该了解这些!、背包问题总结篇!

背包问题总结篇!

2023-08-06 11:52:07 90

原创 代码随想录算法训练营第48天|动态规划part06|动态规划:完全背包理论基础、 518. 零钱兑换 II、 377. 组合总和 Ⅳ

如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。而不会出现{5, 1}的情况。

2023-07-30 21:05:08 46

原创 代码随想录算法训练营第46天|动态规划part04|1049. 最后一块石头的重量 II、494. 目标和 、 474.一和零

思路:本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”

2023-07-28 16:09:57 41

原创 代码随想录算法训练营第45天|动态规划part04|01背包问题 二维、 01背包问题 一维、 416. 分割等和子集

对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。所以背包问题的理论基础重中之重是01背包,一定要理解透!所以我先通过纯01背包问题,把01背包原理讲清楚,后续再讲解leetcode题目的时候,重点就是讲解如何转化为01背包问题了。

2023-07-26 12:06:43 35

原创 代码随想录算法训练营第43天|动态规划part03| 343. 整数拆分、96.不同的二叉搜索树

(其实效果和j * dp[i - j]是一样的。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});那么在取最大值的时候,为什么还要比较dp[i]呢?因为在递推公式推导的过程中,每次计算dp[i],取最大的而已。

2023-07-25 10:45:28 42

原创 代码随想录算法训练营第43天|动态规划part02| 62.不同路径、63. 不同路径 II

思路:从起始点出发,起始点所在的行和列都仅有一条路径,因为只能向右或者向下运动,所以预先初始化之后,从起始点的斜下方开始计算路径,每个点的路径数量可以由其上方和左方的路径之和得到也就是说本次状态的计算需要依靠上一次的状态,考虑动态规划代码:python思路:深搜这道题目,刚一看最直观的想法就是用图论里的深搜,来枚举出来有多少种路径。注意题目中说机器人每次只能向下或者向右移动一步,如图举例:大家如果提交了代码就会发现超时了!来分析一下时间复杂度,这个深搜的算法,其实就是要遍历整个二叉树。

2023-07-24 19:37:47 464

原创 代码随想录算法训练营第42天|动态规划part01| 理论基础、 509. 斐波那契数、 70. 爬楼梯、 746. 使用最小花费爬楼梯

这体现出确定dp数组以及。

2023-07-23 15:46:26 35

原创 代码随想录算法训练营第41天|贪心算法part06| 738.单调递增的数字、 968.监控二叉树 (可以跳过)、 总结

链接。

2023-07-22 16:18:07 47

原创 代码随想录算法训练营第39天|贪心算法part05| 435. 无重叠区间、 763.划分字母区间、 56. 合并区间

思路:这道题根射气球那道题很像,气球那道题是求不重叠的个数,从而得到需要的弓箭的数量而这道题是移除最小数量的区间,使余下的区间不重叠,思路上差不多,但是就是做不对我的错误在于:先排序,通过比较右区间,如果重叠之间删除当前的结点,前一个结点的右区间还作为下次比较的右区间,代码:python 正确代码如下这道题有很多种解法,记住上面讲的就得了。

2023-07-22 14:47:35 39

原创 代码随想录算法训练营第38天|贪心算法part04|860.柠檬水找零、406.根据身高重建队列、 452. 用最少数量的箭引爆气球

局部最优可推出全局最优,找不出反例,那就试试贪心。刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心,至于严格的数学证明,就不在讨论范围内了。回归本题,整个插入过程如下:排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]插入的过程:插入[7,0]:[[7,0]]插入[7,1]:[[7,0],[7,1]]插入[6,1]:[[7,0],[6,1],[7,1]]

2023-07-21 17:14:46 46

原创 代码随想录算法训练营第37天|贪心算法part03|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

思路:这道题自己做时没什么思路,就是硬做,最终提交几次也做出来了代码:python思路:虽然这道题目大家做的时候,可能都不会去想什么贪心算法,一鼓作气,就AC了。那么本题的解题步骤为:第一步:将数组按照绝对值大小从大到小排序,第二步:从前向后遍历,遇到负数将其变为正数,同时K–第三步:如果K还大于0,那么,将K用完第四步:求和如果没有贪心的思考方式(局部最优,全局最优),很容易陷入贪心简单题凭感觉做,贪心难题直接不会做,其实这样就锻炼不了贪心的思考方式了。代码:python。

2023-07-20 15:13:37 41

原创 代码随想录算法训练营第36天|贪心算法 part02|122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II

买:没买 且 cur>0时买不买:没买 且 cur <= 0 时不买卖:已经买 且 cur < 0时 卖最后,如果买了,卖出去代码:python。

2023-07-19 19:44:48 33

原创 代码随想录算法训练营第35天|贪心算法part01|理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法其实就是。不用花心思去研究其规律, 没有思路就立刻看题解。

2023-07-18 16:32:42 31

原创 代码随想录算法训练营第34天|回溯算法part06|回溯算法总结篇、332.重新安排行程(可跳过)、51. N皇后(可跳过)、37. 解数独(可跳过)

思路:代码:python题目要求:代码:python。

2023-07-18 14:26:39 26

原创 代码随想录算法训练营第32天|回溯算法part05|491.递增子序列、46.全排列、47.全排列 II

代码:python。

2023-07-17 14:03:09 30

原创 代码随想录算法训练营第31天|回溯算法part04| 93.复原IP地址、78.子集、90.子集II

思路:分割问题->需要判断子串是否符合条件 并且 组合只能为4代码:python思路:其实只要意识到这是,切割问题就可以使用回溯搜索法把所有可能性搜出来,和刚做过的131.分割回文串 (opens new window)就十分类似了。代码:python。

2023-07-16 15:27:27 32

原创 代码随想录算法训练营第30天|回溯算法part03| 39. 组合总和 、40.组合总和II 、131.分割回文串

思路:本身没有什么思路,但是按照卡哥的套路进行画树,慢慢的就知道了其中的归路!手写画图如下:代码:python思路:思路是一样的剪支:其实如果已经知道下一层的sum会大于target,就没有必要进入下一层递归了。

2023-07-14 14:05:01 40

原创 代码随想录算法训练营第29天|回溯算法part02|216. 组合总和 III、17. 电话号码的字母组合

思路:相比77. 组合,,在不考虑剪支的条件下,在77. 组合的基础上代码的确定终止条件部分加上求和条件并修改集合范围,即可做出本题代码:python思路:本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。代码:python。

2023-07-13 16:14:40 47

原创 代码随想录算法训练营第24天|回溯算法part01|理论基础、77. 组合

回溯函数也就是递归函数,指的都是一个函数回溯也可以理解为。

2023-07-13 14:16:20 42

原创 代码随想录算法训练营第23天|二叉树part09| 669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

思路:本题注意的地方,就是不能直接删除不在区间内的结点,,所以要去右子树中继续查找如图所示,不能直接将0结点删除。代码:python。

2023-07-12 11:12:17 60 1

原创 代码随想录算法训练营第22天|二叉树part08| 235. 二叉搜索树的最近公共祖先、 701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

思路:二叉搜索树和普通的二叉树在处理最近公共祖先的问题上有什么不同?利用二叉搜索树的特性:如果根结点等于q或者q,那么直接返回根结点如果q和p在跟根结点的两侧,那么也是直接返回根结点如果q和p在根结点的同侧,那么进入到所在侧,进入所在侧以后,重复1,2,3步->有返回值的,返回单条路径的递归代码:python思路:只要从上到下去遍历,。代码:python。

2023-07-11 17:56:57 47

原创 代码随想录算法训练营第21天|二叉树part07|530. 二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

思路:因为是二叉搜索树,所以我想到使用中序遍历想着一次递归就实现求最小绝对差,但是发现根结点的前驱节点无法记录,因此失败代码:python思路:递归 + 中序 +代码:python或者。

2023-07-11 10:07:19 30

原创 代码随想录算法训练营第20天|二叉树part06|654. 最大二叉树、 617.合并二叉树、 700.二叉搜索树中的搜索、 98.验证二叉搜索树

思路:当前递归层要构建的树的数组nums传入的数组为空,返回None代码:python。

2023-07-09 14:26:22 40 1

原创 代码随想录算法训练营第18天|二叉树part05|513.找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树

思路:最底层、最左边层次遍历返回result[-1][0]就是代码:python。

2023-07-07 15:06:11 49 1

原创 代码随想录算法训练营第17天|二叉树part4|110. 平衡二叉树(优先掌握递归)、 257. 二叉树的所有路径 (优先掌握递归)、404.左叶子之和

定义:一个二叉树每个节点 的左右两个子树的的绝对值不超过 1。(注意是高度差,不是深度差)思想:遍历二叉树的每个结点,求其左右孩子的高度差,如果每个结点的高度差都小于等于1范围内,那就是平衡二叉树代码:python思想:二叉树节点的深度:指的最长简单路径边的条数。二叉树节点的高度:指的最长简单路径边的条数。

2023-07-06 16:13:09 41 1

原创 代码随想录算法训练营第16天|二叉树part03|104. 二叉树的最大深度、111. 二叉树的最小深度、 222.完全二叉树的节点个数(优先掌握递归)

这道题层次遍历之后,手撕10道题中已经包含,就是利用层次遍历来做代码python二叉树节点的:指从到的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的:指从到的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)而就是二叉树的最大深度本题:二叉树的深度为到的最长路径上的节点数。代码:python。

2023-07-05 14:10:40 30

原创 代码随想录算法训练营第15天|二叉树 part02| 层序遍历 、226.翻转二叉树、101. 对称二叉树

需要用到队列,这种层序遍历方式就是图论中的广度优先遍历层次遍历动画如下:因为题目中是按层返回结点信息的,如果采用队列的方式,不知道如何按层返回结点信息,所以我就采用了递归的方式,每次返回都是一层的结点信息。

2023-07-04 13:25:35 57

原创 14代码随想录训练算法训练营第14天|二叉树part01| 理论基础、二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

这里帮助大家确定下来递归算法的三个要素。

2023-07-02 15:18:43 44 1

原创 代码随想录算法训练营第11天|栈与队列| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

代码随想录算法训练营第11天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

2023-01-14 14:57:21 61

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除