- 博客(39)
- 收藏
- 关注
原创 代码随想录算法训练营第四十四天|LeetCode1143. 最长公共子序列,LeetCode1035. 不相交的线,LeetCode53. 最大子数组和,LeetCode392. 判断子序列
思路:这道题和上一道题有点类似,为了方便初始化dp数组依旧还是长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。注意是i-1和j-1。在匹配一致时的递推式是一样的,不过不一样的时候dp[i][j]=max(dp[i-1][j],dp[i][j-1]),取的是这两个的最大值,最后返回右下角的结果。
2025-09-07 02:05:36
453
原创 代码随想录算法训练营第四十三天|LeetCode300. 最长递增子序列,LeetCode674. 最长连续递增序列,LeetCode718. 最长重复子数组
思路:这道题是子序列系列的第一道题,我们这道题的dp[i]的含义是以nums[i]为结尾的最长递增子序列的长度,要给所有的dp[i]初始化为1,然后对dp数组进行以下操作,首先j<i,如果nums[j]<nums[i],则令dp[i]=max(dp[i],dp[j]+1)。在循环完之后,我们取dp数组中的最大值。
2025-09-03 16:14:20
593
原创 代码随想录算法训练营第四十二天|LeetCode188. 买卖股票的最佳时机 IV,LeetCode309. 买卖股票的最佳时机含冷冻期,LeetCode714. 买卖股票的最佳时机含手续费
思路:和上一题差不多,只不过在初始化和递推的过程中需要以两个为一组一个循环赋值。
2025-09-02 22:41:14
548
原创 代码随想录算法训练营第四十一天|LeetCode121. 买卖股票的最佳时机,LeetCode122. 买卖股票的最佳时机 II,LeetCode123. 买卖股票的最佳时机 III
思路:这道题用动态规划其实并不是简单的解决方案,直接暴力搜索或者用贪心会简便很多。这道题的dp数组是一个二维数组,dp[i][0]表示在第i天持有股票下的最多现金,dp[i][1]表示第i天没有股票的最多现金。
2025-09-02 14:51:09
481
原创 代码随想录算法训练营第三十九天|LeetCode198. 打家劫舍,LeetCode213. 打家劫舍 II,LeetCode337. 打家劫舍 III
思路:这道题dp[i]的含义是到下标i为止,偷的所有房间的最大的钱数。那么可以这么分析,如果偷i房间那么获取的dp[i]=dp[i-2]+nums[i],如果不偷i放假,那么可以获取的dp[i]=dp[i-1],所以我们的dp[i]应该取二者的最大值。
2025-09-01 16:57:25
623
原创 代码随想录算法训练营第三十八天|LeetCode322. 零钱兑换,LeetCode279. 完全平方数,LeetCode139. 单词拆分
思路:这道题的dp[j]含义是装满含量为j的背包,最少所需dp[j]。递推公式是dp[j]=min(dp[j],dp[j-coins[i]]+1);意思是,不取当前物品和取当前物品的更小值。初始化的话就是dp[0]为0。
2025-09-01 01:57:41
781
原创 代码随想录算法训练营第三十七天|LeetCode518. 零钱兑换 II,LeetCode377. 组合总和 Ⅳ,KamaCoder57. 爬楼梯
思路:这道题应该属于完全背包问题,也就是每一件物品可以取用多次,问有多少种取法。对于这种题和之前的区别主要就是在遍历背包的顺序的一个不同,对于完全背包是从前向后,而对于01背包在遍历背包时是从后向前。这道题dp[i]的含义就是背包大小为i的话,有多少种取数的方法,那么还是和之前一样,累加可能性,如果能取coins[i],那么就加上dp[j-coins[i]]。在创建数组的时候使用uint64_t是因为会有用例超过int的范围。
2025-08-31 20:30:26
572
原创 代码随想录算法训练营第三十六天|LeetCode1049. 最后一块石头的重量 II,LeetCode494. 目标和,LeetCode474. 一和零
思路:和上一题基本一样,也是要分成两堆,每一堆都尽量往一半的值去靠拢,然后让这两堆去碰。只不过最后不一定两边会相等,最后能取到的dp[target],用sum-dp[target]-dp[target]就是最终值。
2025-08-30 02:04:58
820
原创 代码随想录算法训练营第三十五天|KamaCoder46. 携带研究材料,LeetCode416. 分割等和子集
思路:这是最经典的01背包问题,也就是有m件物品,背包的最大空间为n,每件物品有对应的大小存在weight[]数组中,每件物品对应的价值存在value[]数组中。首先我们要定义一个大小为dp[m][n+1]的数组,dp[i][j]的含义是0-i的物品,放入大小为j的背包中。首先我们要初始化第一行,第一行,如果背包大小能装得下物品0,那么dp[0][j]就应该是value[0],第一列初始化为0。
2025-08-28 23:53:41
639
原创 代码随想录算法训练营第三十四天|LeetCode62. 不同路径,LeetCode63. 不同路径 II,LeetCode343. 整数拆分,LeetCode96. 不同的二叉搜索树
思路:定义一个二维数组dp[m][n],这个数组dp[i][j]代表到这个为止的不同路径数,那么首先要把这个数组第一行第一列都定义为1,因为都只有一种到那个位置的方式。然后递推式子就是,dp[i][j]=dp[i-1][j]+dp[i][j-1];
2025-08-27 01:19:47
474
原创 代码随想录算法训练营第三十二天|LeetCode509. 斐波那契数,LeetCode70. 爬楼梯,LeetCode746. 使用最小花费爬楼梯
思路:一道最简单的动态规划题目,定义一个数组,然后往后递推就好,非常基础。
2025-08-25 17:09:00
372
原创 代码随想录算法训练营第三十一天|LeetCode56. 合并区间,LeetCode738. 单调递增的数字,LeetCode968. 监控二叉树
思路:和昨天的两题很相似,依旧是先对所有区间进行排序,然后判断是否有重叠。只不过这题判断重叠的和前几题不一样,这个题的方式是从结果中直接获取最后一个和intervals遍历的当前的判断是否重叠,因为这样方便合并。
2025-08-25 01:13:39
598
原创 代码随想录算法训练营第三十天|LeetCode452. 用最少数量的箭引爆气球,LeetCode435. 无重叠区间,LeetCode763. 划分字母区间
思路:首先把这些范围按左边界从小到大排序,result初始化为1,然后比较每个范围的左边界,和上一个范围的右边界,如果没有重合,那么result++,需要多一根箭,如果有重合,那么我们就可以假设用一根箭,此时我们需要取当前范围的右边界,变为和前一个范围的右边界的最小值(难点!),这样操作是为了看再下一个范围能否用一根箭射穿。
2025-08-21 23:51:48
547
原创 代码随想录算法训练营第二十九天|LeetCode134. 加油站,LeetCode135. 分发糖果,LeetCode860. 柠檬水找零,LeetCode406. 根据身高重建队列
思路:首先遍历一整遍数组,算一下所有的获取减去所有的花费是否小于0,如果小于0直接return -1,然后如果大于等于0就继续,然后再次遍历,与此同时计算curSum,也是用获取减去花费,只不过是一个一个加一起,如果加到某个数,忽然变成负数了,就说明之前选的起点不行,需要把起点重置为这个数的下一个位置,同时重置curSum。
2025-08-21 21:31:23
710
原创 代码随想录算法训练营第二十八天|LeetCode122.买卖股票的最佳时机II,LeetCode55.跳跃游戏,LeetCode45.跳跃游戏II,LeetCode1005.K次取反后最大化的数组和
思路:一道非常简单的题目,我们把相邻两天的差价作为利润,发现这个利润有正有负,我们只需要收集正利润,所有的正利润的综合就是这题所求的最大利润。
2025-08-20 00:23:57
623
原创 代码随想录算法训练营第二十七天|LeetCode455. 分发饼干,LeetCode376. 摆动序列,LeetCode53. 最大子数组和
思路:首先给两个数组从小到大排序,然后大的饼干喂给能满足的最大的孩子。
2025-08-19 00:26:13
474
原创 代码随想录算法训练营第二十六天|LeetCode332. 重新安排行程,LeetCode51. N 皇后,LeetCode37. 解数独
思路:这道题非常复杂,就大体讲一下看了答案之后的思路,首先用一个unordered_map<string, map<string, int>> targets;保存所有的票的情况,第一个string是始发站点,而map<string, int>的string是终点站,int是到这个站点有多少张票。
2025-08-18 20:02:24
644
原创 代码随想录算法训练营第二十五天|LeetCode491. 非递减子序列,LeetCode46. 全排列,LeetCode47. 全排列 II
思路:这道题和之前的题目的一个主要的不同就是需要找到一个递增的序列,这个的处理办法就是把当前的数值和path的最后一个数相比较,必须要大于等于,否则continue,然后还有一点是之前处理过的数字在单层内不再加入,所以我们在每次for循环之前定义一个unordered_set,把处理过的数字加入其中,这样,如果再次调用这个函数uset就会重置,所以他只会确保单层的数字不会重复加入其中,而对于纵深方向重复的数字是可以加入的。
2025-08-17 23:24:23
188
原创 代码随想录算法训练营第二十四天|LeetCode93. 复原 IP 地址,LeetCode78. 子集,LeetCode90. 子集 II
思路:这道题和上一题很像,大体思路是一致的,只不过终止条件是有三个'.'就会终止。所以我们专门设定了一个pointsum用于记录所有的'.'的个数,在之后没切一段就加一,直到三就终止,然后在for循环的逻辑中需要用字符串的insert函数加入'.',再pointsum++,然后再递归的时候需要注意不再是i+1而是i+2因为多加入了一个'.'。然后isValid()函数,需要判断每个小字符串是否合理,主要是判断一下小串开头是否为0,是否有不在0-9范围内的字符,以及数字是否大于255。
2025-08-16 00:55:14
440
原创 代码随想录算法训练营第二十三天|LeetCode39. 组合总和,LeetCode40. 组合总和 II,LeetCode131. 分割回文串
思路:其实这道题和前面的组合问题很像,只不过终止的条件需要更改一下,还有就是递归的参数需要更改一下。由于每个结果数组的个数是不一定的,所以终止条件由之前的达到一定个数变为总和是否大于等于需要的和,大于就直接return,如果等于需要push_back进result中,此外,由于可以取重复的,所以在递归的startindex不需要往后移,直接就是i,而不是i+1。
2025-08-15 11:32:12
868
原创 代码随想录算法训练营第二十二天|LeetCode77. 组合,LeetCode216. 组合总和 III,LeetCode17. 电话号码的字母组合
思路:这种回溯的问题,返回值一般是空,然后这道题的参数分别是n,也就是最后一个数的位置,k是单个数组的大小,然后startindex是每次往后搜的起始位置。这道题的整体思路就是先确定i=startindex,然后往后遍历,在遍历之前需要把当前的i加入到path中(也就是单个数组),然后再遍历,遍历结束后需要弹出之前加入的i(这点很重要!
2025-08-14 16:22:25
634
原创 代码随想录算法训练营第二十一天|LeetCode669. 修剪二叉搜索树,LeetCode108. 将有序数组转换为二叉搜索树,LeetCode538. 把二叉搜索树转换为累加树
思路:如果节点的值比low小,就说明需要去掉这个节点,然后这个节点的左孩子也不用在考虑了,所以此处应该直接返回往右遍历的结果,如果比high大,同理,应该返回这个节点往左遍历的结果,如果在low和high之间,应该要保留,所以直接往左和右遍历就好,再返回这个节点。
2025-08-13 17:56:35
603
原创 代码随想录算法训练营第二十天|LeetCode235. 二叉搜索树的最近公共祖先,LeetCode701. 二叉搜索树中的插入操作,LeetCode450. 删除二叉搜索树中的节点
思路:首先要明确一点,由于这是二叉搜索树,所以如果当前节点的值比这两个节点的值都大,那么就需要往左子树去搜,如果比这两个数都小,那么就需要往这个节点的右子树去搜。如果这个数刚好夹在这两个数之间,那么这个节点就一定是最近公共祖先。
2025-08-12 12:48:59
571
原创 代码随想录算法训练营第十八天|LeetCode530. 二叉搜索树的最小绝对差,LeetCode501. 二叉搜索树中的众数,LeetCode236. 二叉树的最近公共祖先
思路:定义一个变量保存差值,再定义一个节点用于保存前一个节点,然后函数依旧是中序遍历,然后挨个比较差值,保存最小的差值。
2025-08-10 17:52:57
658
原创 代码随想录算法训练营第十七天|LeetCode654. 最大二叉树,LeetCode617. 合并二叉树,LeetCode700. 二叉搜索树中的搜索,LeetCode98. 验证二叉搜索树
思路:先将数组和数组两端的范围作为参数传入,然后我们始终找到最大值的下标,然后创造最大值的节点,然后再左右分别缩小范围,分别遍历左孩子和右孩子,这样就不需要创建新的数组。
2025-08-09 12:56:37
711
原创 代码随想录算法训练营第十六天|LeetCode513. 找树左下角的值,LeetCode112. 路径总和,LeetCode106. 从中序与后序遍历序列构造二叉树
思路:这道题用层序遍历特别方便(也就是迭代不是递归),我们只需要遍历到最后一行,再获得最左边的节点的值即可。
2025-08-08 23:08:18
644
原创 代码随想录算法训练营第十五天|LeetCode110. 平衡二叉树,LeetCode257. 二叉树的所有路径,LeetCode404. 左叶子之和,LeetCode222. 完全二叉树的节点个数
思路:定义一个获取高度的函数,这个和之前做的获取高度不同的点在于,如果左右子树的高度差大于1,那么这个函数会返回-1,此外,如果左右子树的高度已经为-1(不平衡),上层也直接返回-1。如果这些情况都没有发生,那么就是求当前节点的高度。
2025-08-07 23:04:31
676
原创 代码随想录算法训练营第十四天|LeetCode226. 翻转二叉树,LeetCode101. 对称二叉树,LeetCode104. 二叉树的最大深度,LeetCode111. 二叉树的最小深度
思路:按照中左右的方式遍历,这个是前序。
2025-08-05 20:26:50
343
原创 代码随想录算法训练营第十三天|LeetCode144/145/94. 二叉树的前序/后序/中序遍历,LeetCode102. 二叉树的层序遍历
递归思路: 比较简单,记得前序遍历是中左右即可。非递归思路:定义一个栈,根据先序中左右的性质,先加入根节点,然后再加入右孩子,再加入左孩子(注意此处先加入右孩子!!是因为栈是先进后出)。
2025-08-05 12:57:59
608
原创 代码随想录算法训练营第十一天|LeetCode150. 逆波兰表达式求值,LeetCode239. 滑动窗口最大值,LeetCode347. 前 K 个高频元素
思路:这道题考察的是后缀表达式的计算过程,首先构造一个栈,然后如果遇到数字就把数字加入到栈中,如果遇到运算符,那么就从栈中取出两个数字,然后进行运算,最后剩余在栈中的就是运算式的答案。需要注意的点:在遇到数字时,由于原本是字符串类型,因此需要用到stoi函数,也就是string to int,转变为int类型再push。
2025-08-04 02:05:43
880
原创 代码随想录算法训练营第十天|LeetCode232. 用栈实现队列,LeetCode225. 用队列实现栈,LeetCode20. 有效的括号,LeetCode1047. 删除字符串中的所有相邻重复项
思路:用栈模拟了队列的几种操作,其中比较有难度的是pop(),这个需要用到两个栈,将内容保存到stIn中,而pop的时候需要把stIn中的全部放入stOut中,再pop。
2025-08-03 01:13:50
725
原创 代码随想录算法训练营第九天|LeetCode151. 翻转字符串里的单词,KamaCoder55. 右旋字符串,LeetCode28. 实现 strStr(),LeetCode459. 重复的子字符串
思路:这是最复杂的一种题了,需要分为三步:1.去除字符串里的多余空格这里面说的空格包括头尾的空格,以及两个或多个连在一起的空格。2.翻转整个字符串3.翻转每个单词明确了思路之后,我们需要编写两个函数,第一个是删去多余空格的函数,这个函数采用快慢指针的方式,快指针如果遇到不是空格的,说明到单词了,慢指针如果此时不在字符串头上的话,就需要补一个空格,之后只需要复制快指针的内容到慢指针直到又遇到下一个空格。
2025-08-02 21:35:03
792
原创 代码随想录算法训练营第八天|LeetCode344. 反转字符串,LeetCode541. 反转字符串 II,KamaCoder54. 替换数字
思路:这是一道非常简单的字符串题目,只需要首位互换即可,稍微注意下边界。
2025-08-01 21:57:19
435
原创 代码随想录算法训练营第七天|LeetCode454. 四数相加 II,LeetCode383. 赎金信,LeetCode15. 三数之和,LeetCode18. 四数之和
思路:这个题很自然可以想到一个四层循环的思路,那样做时间复杂度是o(n^4),会超时,所以是不对的。正确的做法可以化为两个二层循环,这样可以把时间复杂度降至o(n^2)。先把a+b作为key,而a+b出现的次数作为value,存入map中。然后在另一个二层循环中找map是否有0-(c+d),如果有就在总的count上加上对应的value。
2025-07-30 00:08:31
750
原创 代码随想录算法训练营第六天|LeetCode242. 有效的字母异位词,LeetCode349. 两个数组的交集,LeetCode202. 欢乐数,LeetCode1. 两数之和
思路:这个题总体思路比较简单,创建一个数组用于统计每个数字出现的频数即可,然后可以用相减的方式,最后看这个数组里每个频数是不是都是0来判断这两个字符串是否是字母异位词。需要注意的点:需要注意在数组中每个字母对应的位置可以用s[i]-'a'的方式。
2025-07-29 01:52:23
450
原创 代码随想录算法训练营第四天|LeetCode24. 两两交换链表中的节点,LeetCode19. 删除链表的倒数第N个结点,LeetCode160. 相交链表,LeetCode142. 环形链表 II
思路:依旧创建一个虚拟头结点,方便之后进行操作,然后让cur指向当前的虚拟头结点,然后想明白循环的终止条件是cur->next=NULL(总节点数为偶数的情况)或者cur->next->next=NULL (总节点数为奇数的情况,最后剩一个节点不用交换),在循环内需要将cur->next和cur->next->next->next保存为临时变量,剩余操作就是交换了,以及在交换结束后cur需要向后移动两个位置。
2025-07-26 23:34:35
532
原创 代码随想录算法训练营第三天|LeetCode203. 移除链表元素,LeetCode707. 设计链表,LeetCode206. 反转链表
思路1:将删除头结点的情况和删除后续节点的情况分开讨论,如果是头结点的值恰好等于val,那么需要将头结点后移,并把原先的头结点删除。在上述处理完成后,再讨论之后的节点。思路2:创建一个虚拟头结点,他的next指向当前的头结点,之后只对虚拟头结点进行操作,这样就不需要分类讨论了。在删除操作都完成后,再回来删去虚拟头结点。注意的点:注意最后需要head=dummyhead->next;因为原先的头结点可能已经被删去,所以需要重新确定头结点位置。
2025-07-26 00:09:52
635
原创 代码随想录算法训练营第二天|LeetCode209. 长度最小的子数组,LeetCode59. 螺旋矩阵 II,KamaCoder58. 区间和,KamaCoder44. 开发商购买土地
思路:设一个左指针,一个右指针,他们是滑动窗口的范围,右指针向数组后面走,左指针开始缩小当前滑动窗口的范围,如果sum依旧大于等于target就继续缩,并且随时存储当前最小的滑动窗口长度,在最后返回时,如果min_length依旧等于INT_MAX(就是说没法满足target),则return 0;如果不等于的话就return min_length;
2025-07-24 18:22:04
468
原创 代码随想录算法训练营第一天|LeetCode704. 二分查找,LeetCode27. 移除元素,LeetCode977. 有序数组的平方
思路:在数组两头分别设一个指针,然后让target和nums[mid]相比较,如果小于,则将右指针的范围缩到mid的左边,也就是r=mid-1,并重新设一次mid;如果大于,同理。如果等于则返回当前mid的下标。如果在循环条件结束之前依然没有搜索到,则返回-1。
2025-07-23 23:32:33
1072
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人