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