自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二刷代码随想录训练营Day 49|力扣42. 接雨水、84.柱状图中最大的矩形

note:这道题和前面的单调栈问题的区别在于,它要找到自己两边第一个比自己大的元素,之前我们只是求右边第一个大的元素,不过其实左边第一个大的元素就是在栈里和自己紧挨着的元素。再有就是思路上的难点了,这里的计算面积其实是按照行来计算的。我们找到当前元素左右两边第一个比自己大的元素,那么我们要算的雨水的面积的高就是——左右两边的第一个比自己高的柱子的最小值 - 自己的高;雨水面积的宽就是——这两个柱子的下标相减再减1(为什么减1就自己看图想想)

2024-09-03 12:23:21 346

原创 二刷代码随想录训练营Day 48|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

思路:单调栈通常用来解决“找出后续元素中以一个比当前元素大的值(递增单调栈)”或“第一个比当前元素小的值(单调递减栈)”——这里的单调顺序指的是从栈顶到栈底元素的大小关系。具体的使用原理如下(以此题为例):有点像消消乐,或者对对碰——遍历数组,如果当前元素>栈顶元素,那就把比它小的元素全部“碰”走。在这个“碰”的过程里,灰溜溜地出栈的元素其实就是在这个时候第一次遇到了比它大的元素。这就给出了我们上述提出的问题的回答。

2024-09-02 12:13:47 492

原创 二刷代码随想录训练营Day 46|647. 回文子串、516.最长回文子序列、动态规划总结篇

代码随想录 (programmercarl.com)

2024-08-31 10:02:35 387

原创 二刷代码随想录训练营Day 45|力扣115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

note:dp数组的含义:dp[i][j]表示以i - 1结尾的s里 有多少个 以j - 1为结尾的t递推公式:当s[i - 1] == t[j - 1]时,一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。(因为是从s里找t,因此只考虑s删除元素的情况)dp数组的初始化:初始化第一行和第一列。

2024-08-31 09:14:39 747

原创 二刷代码随想录训练营Day 44|力扣1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

note:这道题我想过可不可以和之前的子序列问题一样,定义以text1[i]和text2[j]结尾的最长子序列的长度作为dp数组的含义,但是很明显在遍历的时候时间复杂度太高了。而且这道题和那道递增的题也是有区别的,因为此题只要有元素相等就可以直接在原有的子序列的基础上添加元素,但是递增子序列的判断就是得对每一个之前的子序列分别进行判断比较的,不然不满足“递增”这个概念。

2024-08-29 09:42:52 350

原创 二刷代码随想录训练营Day 43|力扣300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

note:注意:因为result初始值为0,如果没有进入循环的话,会一直保持初始,导致nums.size()==1的情况也返回了0。所以在开头就要及时把意外情况返回。dp数组的含义:以i为结尾的在下标为[0,i]的元素组成的最长递增子序列的长度为dp[i]递推公式:要知道子序列不必连续,因此为了方便写出递推公式,规定至少要以nums[i]作为结尾,方便去比较,从而去递推。

2024-08-28 15:41:09 375

原创 二刷代码随想录训练营Day 42|力扣188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

note:dp数组的含义:// dp[i][0] 表示什么都没操作// dp[i][2 * j - 1] 表示第j次持有股票的最大利润// dp[i][2 * j] 表示第j次不持有股票的最大利润递推公式:为了可以对不同次数的dp[i][2 * j - 1] 和 dp[i][2 * j]都使用相同的递推公式,我的下标是从1开始的,换句话说,我特意让dp[i][0]表示什么都不操作的状态。

2024-08-27 10:17:03 724

原创 二刷代码随想录训练营Day 41|力扣121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

note:dp数组的含义:dp[i][0]表示当天持有股票的最大利润;dp[i][1]表示当天不持有股票的最大利润递推公式:dp[i][0] = max(dp[i -1][0 ],dp[i - 1][1]) 第i天持有股票,有两种可能,一种是前一天就已经是持有股票的状态了,第i天只是去保持这种状态;另一种是,当天才去购买股票,由于题上说只能购买一支股票,因此直接在0的基础上-prices[i]

2024-08-26 10:04:49 978

原创 二刷代码随想录训练营Day 39|力扣198.打家劫舍、213.打家劫舍II、337.打家劫舍III

note:dp数组的含义:考虑下标为[0,i]的房间(只是考虑,并不是一定会偷),所能偷的最大金额为dp[i]递推公式:对于第i个房间,无非有两种情况,偷或者不偷。如果不偷,那就可以考虑偷下标为[0,i - 1]的房间,也就是dp[i - 1];如果偷,那么第i - 1间房子就不能考虑偷了,也就是dp[ i - 2] + nums[i]。dp数组的初始化:递推公式很明显可以从中看出,我们需要初始化,dp[0] = nums[0] dp[1] = max(nums[0],nums[1])

2024-08-24 10:14:47 494

原创 二刷代码随想录训练营Day 38|322. 零钱兑换、279.完全平方数、139.单词拆分

代码随想录 (programmercarl.com)在此总结一下背包问题的注意事项:背包问题的dp数组在定义的时候,一般大小为bagweight + 1,因为背包的容量从0开始,所以个数要额外加101背包二维dp数组:遍历顺序无所谓,初始化的时候,要把第一行第一列的元素处理好,按照定义来就好了。其余元素初始化成多少都行,因为会被覆盖的01背包 一维dp数组:先遍历物品,再遍历背包,背包要倒序遍历。完全背包 一维dp数组:先遍历物品还是背包都可以,背包要正序遍历。

2024-08-23 09:54:04 968

原创 二刷代码随想录训练营Day 37|完全背包、518. 零钱兑换II、377. 组合总和Ⅳ、70. 爬楼梯(进阶)

代码:(先物品后背包)(先背包后物品)note:dp数组的含义:这是一道完全背包问题。用种类为[0,i]不限个数的物品去填容量为j的背包,所能获得的最大价值为dp[j]递推公式:在装得下第i个物品时,dp[j] = max(dp[j],dp[j - weight[i]] + value[i])dp数组的初始化:dp[0]= 0遍历顺序:纯完全背包,先遍历背包还是物品都可以。背包容量要正序遍历,确保物品个数不受限。

2024-08-22 09:52:26 449

原创 二刷代码随想录训练营Day 36|力扣1049. 最后一块石头的重量 II、494. 目标和、474.一和零

note:这道题的思路是,尽量将石头分为两组相同的重量,然后相撞后,剩余的石头的重量就是题上所求。进一步讲的话,就是用石头去装容量为石头总重量一半的背包,看最后最多能装多少重量。用总量减去这个数的两倍就是题上所求。dp数组的含义:用下标为[0,i]的stones去装容量为j的背包,做能装的最大重量为dp[j]递推公式:在可以装得下stones[i]的前提下,dp[j] = max(dp[j],dp[j - stones[i]] + stones[i])dp数组的初始化:dp[0] = 0。

2024-08-21 10:25:56 406

原创 二刷代码随想录代码训练营Day 35|01背包问题 二维、01背包问题 一维、力扣416. 分割等和子集

note:dp数组的含义:在容量为j的背包中,装入种类为[0,i]的物品,所能拥有的最大价值为value[i][j]递推公式:如果容量不够weight[i],dp[i][j] = dp[i - 1][j];如果容量够,dp[i][j] = max(dp[i - 1][j] ,dp[i - 1][j - weight[i] + value[i])dp数组的初始化:按照定义去进行初始化,因为所有的元素都依赖于上一行的元素,因此,只需要初始化第一行。

2024-08-20 09:46:05 367

原创 二刷代码随想录训练营Day 34|力扣62.不同路径、63. 不同路径 II、343.整数拆分、96.不同的二叉搜索树

note:涉及到方法数,一般就是用加法。这里说只能往右或者往下走,因此就将左方和上方的方法数加起来就是所求。dp数组的含义:到达(i,j)下标的方法数为dp[i][j]递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]dp数组的初始化:因为需要上方和左方的元素来推导,所以我们要初始化第一行和第一列。由于dp数组的含义是方法数,那么这些初始化的值就都是1,因为只有一种方法——沿直线走。

2024-08-19 09:43:33 690

原创 代码随想录八股训练营 完成总结

其实我感觉这次的八股打卡还是留有一些遗憾的,因为我在第三周和第四周的时候,生了病心情也不好,直接旷了两周的打卡。不过,我在最后两周的时候,一天打两天的卡,赶着今天把所有的打卡都补完了。

2024-08-17 10:58:56 1012 1

原创 二刷代码随想录训练营Day 32|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

因此,爬到第i个楼梯的方法数 = dp[i ]= dp[i - 1] + dp[i - 2]递推公式:dp[i] = min(dp[i-1] + cost[i-1],dp[i - 2] + cost[i - 2])dp数组的初始化:初始化dp[0] = 0 dp[1] = 0,因为题上说可以从i= 0和i= 1的台阶开始爬。递推公式:dp[i] = dp[i - 1] + dp[i - 2]dp数组的含义:爬到第i个台阶所用的最小花费是dp[i]dp数组的含义:爬到第i个楼梯所用的方法数是dp[i]

2024-08-17 09:07:59 575

原创 二刷代码随想录训练营Day 31|56. 合并区间、738.单调递增的数字、968.监控二叉树、总结

note:这道题和之前的重叠区间的判断一样的逻辑。(都要先排序哦)只不过我们这次直接用新数组里的最新元素去和当前遍历元素去比,如果两种重叠,就去更新数组内的元素的右边界为两者的最大值。

2024-08-16 09:52:52 349

原创 二刷代码随想录训练营Day 30|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

note:这道题有思路,但是就是自己写不出来,出从下手。但其实实现起来没有那么难。首先先对数组按照左边界进行排序,然后就开始遍历所有的区间,如果两个区间不重叠,就result++;如果两个区间重叠,那就更新当前数组的右边界为min(当前区间右边界,上一个区间的右边界)result要初始化为1,因为数组是从下标1开始遍历的。

2024-08-15 09:43:23 229

原创 二刷代码随想录训练营Day 29|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

note:在当前油的总量为负数时,选择下一个站点重新开始。我感觉这个思路和最大子序和很像。。

2024-08-14 10:31:08 227

原创 二刷代码随想录训练营Day 28|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和

note:思路是,可以在一个表格中把这些价格和天数对应的点都连起来,我们所能获得的最大利润就是表里所有上升段数的数值累加。

2024-08-13 10:20:47 231

原创 二刷代码随想录训练营Day 27|理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

result初始为1,默认为最后一个元素代表的峰值。在遍历中为了防止数组越界,没有遍历最后一个元素。note:好像没什么好讲的。就是如果sum<0时,重新开始。note:要分清楚饼干和孩子,以及返回哪个值。在数组长度小于等于1的时候,要及时返回。

2024-08-12 09:41:23 190

原创 二刷代码随想录训练营Day 25|491.递增子序列、46.全排列、47.全排列 II、332.重新安排行程、51.n皇后、37.解数独

note:这里不用used数组来去重的原因是,本题不能对数组进行排序,会破坏原数组元素间的相对关系。

2024-08-10 12:41:39 293

原创 二刷代码随想录训练营Day 24|93.复原IP地址、78.子集、90.子集II

note:对于insert和erase的用法还不熟悉。

2024-08-09 09:30:53 205

原创 二刷代码随想录训练营Day 23|39. 组合总和、40.组合总和II、131.分割回文串

代码:回溯法note:这里可以选取重复元素,然后我就陷入了迷茫。因为虽然可以选取重复元素,但是组合问题也是要去重的,这又明显和前面的不能选取重复元素的题目不同。这里其实还是使用startIndex来去重,不过因为可以选取重复元素,startIndex从i开始而不是从i+1开始。代码:剪枝优化note:这里的剪枝优化是指,因为candidates的元素都是正数,因此target减去一个正数只会越来越小。我们先将candidates里的元素进行排序。

2024-08-08 10:29:56 379

原创 二刷代码随想录训练营Day 22|理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

note:这里的技巧就是,首先得想到我们需要一个变量标识出我们从哪个对应的字符串来取值,也就是代码里的index。在每一次进行操作的时候,我们需要把当前的取值的字符串找到——因此就要去想已知的变量怎么转化从这个我们需要的字符串。已经遍历收获的元素个数是path.size(),还需要收获k - path.size()个元素,总共有n个元素,因此我们需要的最大的开始位置是 n - (k - path.size()) + 1。note:这里剪枝的部分体现在for循环的循环条件的修改。

2024-08-07 10:01:15 378

原创 二刷代码随想录训练营Day 21|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇

代码随想录。

2024-08-06 10:32:24 207

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

代码:递归法note:老天,我把大小于搞反了代码:迭代法。

2024-08-05 15:14:58 277

原创 二刷代码随想录训练营Day 18|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

代码:递归法 双指针note:INT_MAX写错了。。。。代码:迭代法 双指针。

2024-08-05 13:57:26 213

原创 二刷代码随想录训练营Day 17|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

代码:note:这里用到的切割数组用到的迭代器,都是左闭右开区间,因此右数组的开始范围是nums.begin() + index + 1。我这里写错了。这种构建二叉树的题,都只能用前序遍历,因为左右孩子需要先有根结点,才能和根结点连接。

2024-08-04 22:03:14 438

原创 二刷代码随想录训练营Day 16|513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树

代码:note:深度最大,确保是最后一行 先遍历左孩子再遍历右孩子 确保是左下角。

2024-08-01 13:17:04 531

原创 二刷代码随想录训练营Day 15|力扣110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

代码:递归note:我一开始还在想,怎么把这个高度和判断结果都返回去,或者把高度用全局变量或参数来传递。后来才知道——可以用返回值高度为-1来表示false!!!如果本题要使用迭代法,可以用这样的思路:用一个函数来求传入节点的高度(其实是根结点的最大深度)。在主函数里,用后序遍历去判断每个节点的左右孩子的高度差有没有超过1。

2024-07-31 11:48:16 274

原创 二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

代码随想录。

2024-07-30 22:04:39 369

原创 二刷代码随想录训练营Day 14| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

代码:递归 (前序)代码:迭代(前序)代码: 统一迭代(前序)note:这道题用中序会很麻烦,因为可以在翻转的过程中,导致一些翻转过的子树又被翻转回去了,而一些子树没有被翻转过。

2024-07-30 20:57:22 293

原创 二刷代码随想录算法训练营Day 10|理论基础、232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

peak函数则是应用到了前面这个“stOut栈”的更新,调用了pop函数,然后在把弹出的元素压回去。top的实现和上者类似,但是top不改变队列,因此在取到最后一个元素后,还要将这个队列恢复原状,也就是将最后的元素也重新加入队列。note:pop的实现,是把除了最后一个元素的其余元素,全部都重新加入队列。这个时候,最末尾的元素就到了队头,把它弹出就好了。note:技巧就是,可以遇到左括号时,把其对应的右括号压入栈中。note:遇到栈为空或者栈顶元素和处理的元素不同时,就压入栈;

2024-07-30 13:54:57 344

原创 二刷代码随想录训练营Day 9|151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾

代码随想录。

2024-07-29 19:23:51 462

原创 二刷代码随想录训练营Day 8|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

note:没什么好说的。

2024-07-29 15:18:38 348

原创 二刷代码随想录训练营Day 13| 理论基础、递归遍历、迭代遍历、统一迭代、层序遍历

note:size是判断后进行--才进入循环的,因此应该是判断条件为size==0的时候收集结果。note:只要不是该层最后一个结点,就让当前遍历的结点指向队列里的下一个结点。note:使用栈进行遍历的时候,要记得栈是先进后出,因此顺序得反一下。note:在前序的基础上改了左右的顺序,同时最后再来个数组的翻转。note:只有当左右孩子都为空的时候才能收获结果。note:sum是double类型。前序:(用了栈 顺序要反一下)代码:(前序遍历)中左右。代码:(后序遍历)左右中。代码:(中序遍历)左中右。

2024-07-29 14:11:48 416

原创 二刷代码随想录训练营Day 7|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和、总结

代码随想录 (programmercarl.com)

2024-07-29 10:23:44 476

原创 二刷代码随想录训练营Day 6|哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

先用record来统计s字符串里字母的出现次数,再用统计好的record去减去t字符串里的字母的出现次数,如果最后record数组里每个元素都为0,则说明两个字符串确实是有效的字母异位词。创建一个unordered_map,key是排序后的字符串,vaule是那些排序后的字符串和key一样的字符串数组。note:用固定窗口大小的滑动窗口移动来依次判断子数组是不是另一个数组的有效异位词,判断的方式是通过数组进行26个英文字母的哈希映射。note:主要难以理解的是代码,数据结构嵌合的有点子复杂。

2024-07-28 18:26:11 455

原创 二刷代码随想录训练营Day 4|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II、总结

代码随想录。

2024-07-20 17:33:15 360

空空如也

空空如也

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

TA关注的人

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