- 博客(41)
- 收藏
- 关注
原创 代码随想录day48-单调栈/每日温度/下一个更大元素 I/下一个更大元素II
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。这个解法不用遍历nums1,只要遍历找到nums2中比栈中数大的数时,如果栈中数在nums1中存在,就修改ans中的值;如果当前遍历的元素大于栈顶元素,表示栈顶元素的右边的最大的元素就是当前遍历的元素,所以弹出栈顶元素,并记录。注意,单调栈里加入的元素是下标。
2025-06-25 11:55:08
270
原创 代码随想录day46-回文子串/最长回文子序列/动态规划总结
dp[i][j] 表示区间范围 [i,j] 的子串是否是回文子串。s[i]与s[j]相等时,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。注意要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。516.最长回文子序列。注意遍历时j=i+1。
2025-06-23 15:27:47
166
原创 代码随想录day45-不同的子序列/ 两个字符串的删除操作/编辑距离/编辑距离总结
递推公式和初始化都需要考虑。递推公式注意如果s和t的下一个字母相等,dp[i][j]=dp[i-1][j-1]+dp[i-1][j]。word2添加一个元素,相当于word1删除一个元素,例如。583. 两个字符串的删除操作。, 最终的操作数是一样!115.不同的子序列。不相等时取得是最小值。
2025-06-23 13:50:15
279
原创 代码随想录day44-最长公共子序列/不相交的线/最大子数组和
这个可以不连续但要有顺序,因此返回的结果就是dp数组的最后一个数。要注意如果text1.charAt(i-1)!=text2.charAt(j-1)时,dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])。1143.最长公共子序列。53. 最大子数组和。1035.不相交的线。这道题在贪心也做过。
2025-06-19 17:01:16
112
原创 代码随想录day43-最长递增子序列/最长连续递增序列/最长重复子数组
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j](这样不需要初始化)。当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1。dp数组代表i之前包括i的以nums[i]结尾的最长递增子序列的长度,全部初始化为1。每次循环都要从一开始递归到当前数字之前。674. 最长连续递增序列。718. 最长重复子数组。
2025-06-13 15:21:06
249
原创 代码随想录day42-买卖股票的最佳时机IV/最佳买卖股票时机含冷冻期/买卖股票的最佳时机含手续费/股票问题总结
好烦,递推公式每次想半天还错。这道题四个状态,买入状态,今天卖出(冷冻期需要用到今天卖出这个状态),冷冻期,卖出状态。714.买卖股票的最佳时机含手续费。309.最佳买卖股票时机含冷冻期。188.买卖股票的最佳时机IV。和买卖股票三很像,扩展一下。
2025-06-11 09:45:40
141
原创 代码随想录day41-买卖股票的最佳时机/买卖股票的最佳时机II/买卖股票的最佳时机III
121. 买卖股票的最佳时机取左最小值,右最大值。动态规划:一个大小为2的dp数组,一个表示持有,一个表示卖出。递归公式挺绕的。122.买卖股票的最佳时机II之前写过。这一天比前一天的价格低,赚的钱就加上这一天价格-前一天价格。动态规划:和上一题很像,不同点在于可以反复购入卖出,所以卖出时要持有(dp[1]),购买时要不持有(dp[0])。
2025-04-28 14:39:51
333
原创 代码随想录day39-打家劫舍/打家劫舍II/打家劫舍III
和上一道题的区别是成环,可以分解为两种情况用上一道题的思路做:1)包含首元素不包含尾元素;2)包含尾元素不包含首元素。感觉二叉树又忘了,不知道该用哪种遍历方式。这个dp数组的设计比较巧妙,只需要一个长度为2的int数组表示偷/不偷该节点的最大金额,然后用数组递归每个结点。要用后序遍历因为计算本节点偷不偷要依赖其左右孩子的返回值。比较偷上上家最高金额和这家金额高,还是偷上一家最高金额高。但是感觉我代码写的有点绕。337.打家劫舍III。213.打家劫舍II。
2025-04-23 16:49:36
170
原创 代码随想录day37-完全背包/518. 零钱兑换 II/377. 组合总和 Ⅳ/爬楼梯 (进阶)
先遍历背包后遍历物品,得到的是排列数;先遍历物品后遍历背包,得到的是组合数。其实还有点没懂,先记住了...其实还有点没懂...但是懂了完全背包因为可以重复取物品,所以背包容量的循环是正序的,01背包是倒序的。和昨天的494.目标和递推公式很像。518. 零钱兑换 II。377. 组合总和 Ⅳ。
2025-04-22 19:58:53
158
原创 代码随想录day36-最后一块石头的重量 II/目标和/一和零
1049. 最后一块石头的重量 II本题其实是尽量让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。和昨天的416. 分割等和子集很像,但是要不是刚做过416,感觉也挺难想到的。494. 目标和动态规划:换个题目递推公式又不会了...看了题解,和背包的上一题还是有区别的,要求的不是最大值,而是方法数。
2025-04-22 14:46:41
292
原创 代码随想录day35-01背包问题二维/01背包问题一维/分割等和子集
题目链接:46. 携带研究材料(第六期模拟笔试)题目讲解:代码随想录动态规划:1. 确定dp数组以及下标的含义:i表示物品,j表示背包容量。dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。2. 确定递推公式:递归公式:不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物
2025-04-22 10:52:27
1100
原创 代码随想录day34-不同路径/不同路径 II/整数拆分(先跳了)/不同的二叉搜索树(先跳了)
62.不同路径没想到推导公式。这个第一次看有点难懂,看懂双重循环每次迭代的数组值就懂了。63. 不同路径 II动态规划:和上一题类似,但是需要在遇到障碍物时赋值为0,注意初始化第一行第一列时遇到障碍物,后面的也都赋值为0。
2025-04-21 12:47:18
332
原创 代码随想录day32-动态规划基础/斐波那契数/爬楼梯/使用最小花费爬楼梯
和斐波那契很像,方法数就等于上个台阶的方法数+上上个台阶的方法数。比较简单,按照步骤找到公式就行。746. 使用最小花费爬楼梯。509. 斐波那契数。
2025-04-21 11:03:22
204
原创 代码随想录day31-合并区间/单调递增的数字/贪心算法总结
从高位向低位找到第一个不满足单调递增的位置,将该位减一并将后面所有位变为9,从而构造出不超过原数的最大单调递增数字。968.监控二叉树 (跳过了)和前一天的重叠区间意思一样。738.单调递增的数字。
2025-04-19 23:09:46
194
原创 代码随想录day30-用最少数量的箭引爆气球/无重叠区间/划分字母区间
是要求区间重叠的问题,先给左边界值排序,再将下一个区间的左边界和当前有重叠的区间的最小右边界比较。如果不重叠,ans++,更新最小右边界;如果重叠,更新最小右边界。感觉特别麻烦,好多点都想不到。比如遍历求最后位置的时候用s.charAt(i)-'a'定位,比如要遍历到i==last的时候切割。452. 用最少数量的箭引爆气球。跟上一题很像,只改了右边界取值。435. 无重叠区间。763.划分字母区间。
2025-04-19 19:34:11
227
原创 代码随想录day29-加油站/分发糖果/柠檬水找零/根据身高重建队列
跟分发糖果类似,感觉比分发糖果更难。先按身高从大到小排序,然后再看前面有几个身高>=自身的人,就插入到第几个的位置。要遍历两次,一次从左向右比较,一次从右向左比较并取两次遍历最大值。思路想不到,弄懂以后代码很好写。代码里好多二维数组的操作都不太熟悉,可以再多看看。比较简单,边遍历边算,但是不知道哪用了贪心。406.根据身高重建队列。
2025-04-19 18:04:19
379
原创 代码随想录day28-买卖股票的最佳时机II/跳跃游戏/跳跃游戏 II/K次取反后最大化的数组和
122.买卖股票的最佳时机II这个想到了,简单。
2025-04-13 18:22:06
197
原创 代码随想录day27-贪心基础/分发饼干/摆动序列/最大子序和
主要是没想清楚什么时候需要重新开始计算,应该是curnum+num[i]<nums[i]的时候,就从头开始。刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。可以选大饼干喂给大胃口的孩子,也可以小饼干喂给小胃口的孩子。想不出来,看讲解感觉好聪明,以后也可以试试画图找规律(?
2025-04-13 16:37:06
216
原创 代码随想录day25-递增子序列/全排列/全排列 II/回溯总结
感觉比较难,需要一个hashmap或者一个数组来做去重判断,知道是这样写的,那个判断条件也写不对,要彻底想清楚什么时候需要去重,是要同一层内去重。和之前的不同点在于每次都要从第一个数开始搜,所以没有startindex了,而且要跳过已经使用过的数字。没有i>startindex的判断了,改用!used[i-1]。而且要先判断used[i]。
2025-04-12 20:47:39
287
原创 代码随想录day24-复原IP地址/子集/子集II
和分割回文串差不多,就是字符串中间需要加".",但是最后一段不用加。看了一下力扣里用时比较短的,直接边判断边写了,剪枝方便很多。和组合的回溯差不多,注意全部添加进ans就行。和组合二一样,同一支可以重复,同一层不能重复。自己写的,改了好多次,用时很长。
2025-04-12 16:10:00
331
原创 代码随想录day23-组合总和/组合总和II/分割回文串
39. 组合总和注意可以重复取一个数,传参时不用+1,返回条件判断时sum>target时startindex再+1。
2025-04-11 21:13:51
306
原创 代码随想录day22-回溯算法理论基础/组合/组合总和III/电话号码的字母组合
看了视频讲解,好像懂了又好像没懂。剪枝可有可无,有的话省时间,但是感觉容易出错。和上一题差不多,加一个sum。17.电话号码的字母组合。
2025-04-10 22:58:50
329
原创 代码随想录day21-修剪二叉搜索树/将有序数组转换为二叉搜索树/把二叉搜索树转换为累加树/二叉树总结
如果root已经<low,root的左子树肯定<low,只需要返回右子树的根节点,反之。如果root在区间内,遍历左右子树。总感觉做过类似的,每次都取区间中间的数,左子树区间为[left,mid-1],右子树区间为[mid+1,right]。比较简单,想明白是按照右-中-左的顺序就行。
2025-04-10 18:06:23
302
原创 代码随想录day20-二叉搜索树的最近公共祖先/二叉搜索树中的插入操作/删除二叉搜索树中的节点
情况有点多,很复杂,看了讲解后对着力扣题解的几种情况写的。想明白只要遍历找到空位置,插入新结点就可以了。
2025-04-09 22:19:13
156
原创 代码随想录day18-二叉搜索树的最小绝对差/二叉搜索树中的众数/二叉树的最近公共祖先
(1)如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。二叉搜索树前序遍历结果是有序数组,相邻两个数依次相减比较即可得到最小差值。注意要把递归过程中不能正确改变的量设置为类变量,比如max,n。(2)节点本身p(q),它拥有一个子孙节点q(p)。前面的都想到了,卡在没想到可以清空数组。
2025-04-02 00:00:30
346
原创 代码随想录day17-最大二叉树/合并二叉树/二叉搜索树中的搜索/验证二叉搜索树
654.最大二叉树递归:注意m要设初始值,不然默认负数会出错。递归时候注意数组范围取值。
2025-03-30 22:08:15
252
原创 代码随想录day16-找树左下角的值/路径总和I II/从中序与后序遍历序列构造二叉树/从前序与中序遍历序列构造二叉树
移除当前结点,写的时候只在叶子结点的时候移除了。
2025-03-27 18:09:50
240
原创 代码随想录day15-平衡二叉树/二叉树的所有路径/左叶子之和/完全二叉树的节点个数
好难理解,力扣题解是比较容易理解代码,但原理不是很透彻。代码随想录的很全面,但是写不出来,要考虑的太多了。照着理解之后看着写的,之后可以重做。需要依次判断,注意三个条件都不满足的情况下返回的是最大高度,因为要判断leftd-rightd绝对值的大小。当满足是左结点+是叶子结点时,将值加入到和中。
2025-03-26 18:30:46
158
原创 代码随想录day14-翻转二叉树/对称二叉树/二叉树的最大深度/二叉树的最小深度
想不出来就难,想出来就简单,注意递归的时候要同时满足compare(left.right,right.left) && compare(left.left,right.right)。做的时候想的有点多,在递归里加了很多没用的判断,其实只要比较左右子树的最大值就行了...前序/后序都可以,中序不可以。
2025-03-26 00:11:41
297
原创 代码随想录day10-用栈实现队列/用队列实现栈/有效的括号/删除字符串相邻重复项
只要知道pop(),peek(),push(),isEmpty()的操作就行。模拟:存入时最新元素先放入que2,把que中元素全转移到que2,再把que2中元素全转移到que,得到的que就是倒序的,弹出时先入后出。记住存入offer(),弹出poll(),读取peek()。速度比上面的快一些。和上一题差不多,简单一些,注意返回的时候,因为栈是先入后出,所以是ss=stk.pop()+ss,出栈的每次都加在前面。记住StringBuffer,入栈append(),出栈deleteCharAt()。
2025-03-22 16:39:33
333
原创 代码随想录day9-翻转字符串里单词/右旋转字符串/KMP
151.翻转字符串里的单词好容易出错,写了好久。大概思路看注释就行。不太熟悉java函数,贴一下力扣题解。使用将字符串按连续的空白字符(空格、制表符等)分割成单词数组。\\s+是一个正则表达式,表示匹配一个或多个空白字符。使用将反转后的单词列表用单个空格拼接成一个字符串。卡码网:55.右旋转字符串。
2025-03-21 22:49:31
145
原创 代码随想录day8-反转字符串/反转字符串II/替换数字
一开始理解错了,理解成只修改前k个了,要注意是每2k个就修改前k个,可能改好几轮。第一次写得很复杂,判断条件是while(n-left>=k),还要弄计数器,单独处理最后<k的情况。但是改成每次i+=2*k就很简单了,注意right的取值就行。还有注意返回的不是arr.toString(),是new String(arr)。先贴一下答案,明天写。
2025-03-20 22:58:53
236
原创 代码随想录day7-四数相加/赎金信/三数之和/四数之和
自己敲了一遍,错在没有在进入第一层循环时判断是否直接>target(这个不太懂,本来以为没有这行,后面的代码也能得出正确答案的),sum应该设置成long,少了while(left<right)这层循环,以及left/right去重时应该用while而不是if。感觉方法几句话说不清楚,大概是先给数组排序,用一个指针从头到尾遍历数组,左右指针在该指针后面移动,三数之和>0则右指针左移,<0则左指针右移,=0时存入三个指针,同时右指针左移+左指针右移。思路和三数之和一样,就是多了层for循环。
2025-03-20 00:15:02
414
原创 代码随想录day6-哈希表基础/字母异位/两个数组交集/快乐数/两数之和
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
2025-03-18 21:22:41
1394
原创 代码随想录day4-两两交换链表节点/删除倒数第N个节点/链表相交/环形链表
双指针:右指针和左指针相隔n个结点,直到右指针为空时,修改左指针.next为左指针.next.next。可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。这个注意是三个结点的值来回交换就行了,还有要注意设置dummyhead,会清晰一些,要注意返回的是dummyhead.next而不是head。自己看没看懂,题目里有个评论写的很清楚,贴一下。
2025-03-18 00:21:57
1526
原创 代码随想录day2-长度最小的子数组(滑动窗口)/螺旋矩阵
209.长度最小的子数组暴力:超时了。两个for循环,从数组每个下标开始遍历,按顺序加和,直到>=目标数。滑动窗口:只循环右指针,在子数组和>target时,向右移动左指针,尝试找出更小的满足条件的子数组,并更新最小数组大小;否则向右移动右指针。力扣官方题解里的图很好懂,看一遍就知道什么意思了。59.螺旋矩阵II按层模拟:一开始没设置层数直接写的,结果发现n为奇数的时候中间填充不上。设置了层数之后就比较清晰了,但是这个写法需要特别特别注意循环条件。力扣题解更简单,贴一下,有时间再写。
2025-03-13 18:13:26
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人