
代码随想录
我要早睡o.o
这个作者很懒,什么都没留下…
展开
-
代码随想录day43|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零
直接带入计算,在数组[0]中, x=(target+sum)/2,那么x=0,那么dp[0]=1,因为零的的前面不管是什么符号,都是一样的意义,所以说,填满容量为0的背包,都有一种情况。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);递推公式:dp[j] = max(dp[j],dp[j-stones[j]]+stones[j]]dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。原创 2024-04-15 19:51:07 · 493 阅读 · 0 评论 -
代码随想录day42|背包问题、416. 分割等和子集
所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);其他的位置的话,其实初始什么数值都是可以的,因为dp[i][j]是由左上方和正上方决定的,其他的位置都是会被覆盖的,初始化成零的话,更方便一点。dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。第i件物品的重量是weight[i],得到的价值是value[i]。原创 2024-04-08 19:45:04 · 978 阅读 · 0 评论 -
代码随想录day41| 343. 整数拆分 、96.不同的二叉搜索树
递推公式:dp[i]+=dp[j-1]*dp[i-j];初始化:dp[0] = 1,dp[1] =1因为根结点为0或1是所有二叉树的种类之一,其余都要初始化为零,因为要不断的累加,所以说要从零开始累加。——这其实是在不断更新dp[i]的值,不放进的话,原本的dp[i]会直接被舍弃。初始化:dp[0]和dp[1]都是没有意义的,所以初始化为零,dp[2]=1。dp[i]:对i进行拆分,相乘得到的最大值dp[i]dp[i]:输入i时, 有dp[i]种情况。为什么还要dp[i[放进去比较?遍历顺序:从前向向后。原创 2024-04-02 20:24:57 · 345 阅读 · 0 评论 -
代码随想录day39| 62.不同路径 ,63. 不同路径 II
递推公式:没有路障的时候 dp[i][j] = dp[i-1][j]+dp[i][j-1] ——因为题目中要求是只可以向下或者向左。递推公式:dp[i][j] = dp[i-1][j]+dp[i][j-1] ——因为题目中要求是只可以向下或者向左。初始化:dp[i][0]和dp[0] 都是为1——因为只可以向下或者向左走,这两边只能直走。初始化:两边上遇到障碍后变成初始化零,在其前面初始化为1。dp[i][j]:到达这个数组不同路径和。dp[i][j]:到达这个数组不同路径和。原创 2024-04-02 18:58:54 · 316 阅读 · 0 评论 -
代码随想录day38| 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯
递推公式:dp[i-2]+dp[i-1]——因为有两种方法可以上楼梯,所以第上第i阶时应该是走到第i-2阶的方法加上第i-1阶的方法。递归公式:dp[i] = fmin(dp[i-1] + cost[i-1], dp[i-2] +cost[1-2])初始化:dp[0] = dp[1] = 0 ——可以选择从下标为。dp数组的初始化:dp[0] = 0,dp[1]=1。dp数组的初始化:dp[0] = 0,dp[1]=1。递推公式:等于dp[i-2]+dp[i-1]dp[i]到达第i阶有dp[i]种方法。原创 2024-04-01 20:13:26 · 264 阅读 · 0 评论 -
代码随想录37| 738.单调递增的数字 、贪心算法总结
这道题其实就是看给出的数字的各个位上的数字是否为递增的,如果为递增,就直接不变,不是的话,就输出比它小的最大递增数字(其实就是最大位减一,然后其余位变成9)贪心算法没有套路可以讲,更多是看人对问题的思考,这里其实通过大量题目练习后,然后找到了了一种思路,我觉得贪心算法就是解决方法中比较巧妙的解题方法。——不行,假如1000的话,直接修改的话会是900,因为条件中不包含等于,但这不是最大的。为什么会有flag这个量出现?原创 2024-03-28 20:50:03 · 220 阅读 · 0 评论 -
代码随想录day36| 435. 无重叠区间 、 763.划分字母区间 、56. 合并区间
错误:没有正确的认识到这个hash这记录的是位置,不是距离,要用 end - start + 1;重叠区间其实代码都是相类似的,判断条件都大体不差,有区别的是要进行什么样的操作。这道题其实和用最小数量箭引爆气球一样,代码差不多,都是求重叠区间的量。局部最优:就时找这个区间字母中的最远位置,如何找到这个最远的位置?——可以用哈希表来记录。原创 2024-03-28 20:03:46 · 289 阅读 · 0 评论 -
代码随想录day35|860.柠檬水找零 、406.根据身高重建队列 、 452. 用最少数量的箭引爆气球
—就是二十块找零,有两种策略,第一种是一张十块,一张五块,第二种是三张五块,因为五块的可使用率更高,所以说局部最优是第一种策略,然后再到第二种。——要每个重叠的气球两两互相重叠,才可以用一个箭引爆气球,所以每次将重叠的气球中的最小右孩子记录下来。这里和分饼干一样,要进行分开贪心,是先对身高h进行排序,然后再对前面的人数k进行排序。因为身高是按照从大到小排序,因为动的数字是后面的数字,一定比前面小的。——其实是看返回值,如果返回值为正数,那么要进行交换位置,否则反之。如何理解重叠和这部分该如何处理?原创 2024-03-27 20:03:34 · 290 阅读 · 0 评论 -
代码随想录day34| 1005.K次取反后最大化的数组和、 134. 加油站 、 135. 分发糖果
局部最优是将绝对值最小的数进行反转,然后将所有的数加起来。因为题目要求,评分高的要比评分低的糖果要多。1,右孩子比左孩子大——从前向后遍历。2,左孩子比右孩子大——从后向前遍历。思路:左右两边不可以一起讨论,——为什么要从后向前遍历?原创 2024-03-26 19:33:06 · 291 阅读 · 0 评论 -
代码随想录day32| 122.买卖股票的最佳时机II 、 55. 跳跃游戏 、 45.跳跃游戏II
这道题和跳跃1相类似,也是覆盖范围来决定的,当覆盖还不到最后的时候,步数加加。解题思路:就是将每天的利润都算出来,只要是正的就加加。原创 2024-03-26 08:43:58 · 265 阅读 · 0 评论 -
代码随想录day31|455.分发饼干 、376. 摆动序列 、53. 最大子序和
当我的连续和为负数的时候,那么再继续加下去,也没有用,会使得值变小,所以要舍弃前面的,从当前位置重新来,然后题目中提及到删除,但是我们并不需要真的去删除,我们只需要将出现坡峰的值记录下来就好了。这道题可以将抽象一张图,条件就是有坡峰。第二种:只有首尾只有两个元素。第一种:上下坡中有平坡。第三种:单调坡中有平坡。原创 2024-03-25 20:36:49 · 338 阅读 · 0 评论 -
代码随想录day30|回溯总结
回溯算法就是一种暴力搜索法,就所有的情况都枚举出来。可以将这道题图像化,将它变一颗树。如何解决回溯算法这个问题。然后在判断结果是什么。原创 2024-03-24 19:41:48 · 283 阅读 · 0 评论 -
代码随想录day29|491.递增子序列 、46.全排列 、47.全排列 II
例如:4767 排完序后就是 4677了,其中有个结果是4677,但是这并不是4767的结果。——根据给出例题中,可以看出,我们是不可以进行排序的,因为一旦排序了, 就会产生多的答案。和前面的题的区别不大。原创 2024-03-21 20:46:28 · 226 阅读 · 0 评论 -
代码随想录day03| 203.移除链表元素 、 707.设计链表 、 206.反转链表
总结:有无哑结点的,就是对头节点如何操作的问题。原创 2024-02-23 18:48:17 · 1407 阅读 · 0 评论 -
代码随想录day28| 93.复原IP地址、 78.子集、 90.子集II
这道题目其实和前面的题目上没有本质上差别,这里依旧是切割字符串,这里还进行判断和加点的行为。——因为终止条件是pathTop>numsSize,如果写在了它的下面会有结果被忽略了。这里为什么要将收集结果的条件写在终止条件的上面。原创 2024-03-20 20:39:53 · 300 阅读 · 0 评论 -
代码随想录day27| 39. 组合总和 、 40.组合总和II 、 131.分割回文串
这道题的和上一道题不同的地方是:要进行去重操作,一旦涉及到去重,那么就要对数组进行排序,然后这道题目的去重,去的是相同的结果,而不是去相同的元素,就是对树层进行去重。这道题和前几道题没有什么太大的区别,唯一的区别就是,元素是可以重复使用的。这里先将进行切割,切割成多个字符串,然后再进行判断是否为回文串。startindex其实是一条切割线。递归终止条件是什么?原创 2024-03-18 21:14:05 · 369 阅读 · 0 评论 -
代码随想录day25| 216.组合总和III 、 17.电话号码的字母组合
其实这个大体和组合这个问题差不多,这里其实将一个完整的数组分成了不同的数组,然后根据题目的要求,选择出相应的数组。这里的难点就是如何有字符串和如何将数字与字符链接起来,变成一个数组。原创 2024-03-17 21:13:34 · 232 阅读 · 0 评论 -
代码随想录day24| 77. 组合
回溯算法——一种暴力穷举的方法。原创 2024-03-17 20:05:11 · 316 阅读 · 0 评论 -
代码随想录day23| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
思路:这道题删除二叉树中的树值很类似,但是我们不能直接将它的子结点返回,而是要对它的子结点进行修剪后才可以返回。原创 2024-03-15 20:19:48 · 210 阅读 · 0 评论 -
代码随想录day22|235. 二叉搜索树的最近公共祖先 、 701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点
根据二叉搜查树的特点,我们可以将情况分成三种,第一种是两个值在分别在左右子树上,第二和三情况是两个值都在左子树或者右子树上。如果左右不为空,那么找要被删除结点的右子结点的最左子结点,然后将删除的左子结点放到最左子结点的左节点。有五种情况第一种为空树,第二种为树叶结点,第三四种,其中一个子结点为空,第五种左右结点都不为空。——因为不满足这两种情况的话,那一定就属于第一情况,题目中说到一个结点也是它本身的公共祖先。如果其中一个子结点为空的话,那么返回他的结点。如果为空树和树叶结点的话,那么直接返回空。原创 2024-03-15 18:57:17 · 182 阅读 · 0 评论 -
代码随想录day20| 654.最大二叉树 、 617.合并二叉树 、 700.二叉搜索树中的搜索 、 98.验证二叉搜索树
解题思路:比较时候不能只看当前子树是否满足搜查二叉树,因为逆这个子树满足了,不代表着正课二叉是满足搜查二叉树的。——返回另外一个树的子结点,不是子结点的值,因为两个树是一起操作做的。——没有想起二叉搜索树是已经排序了的。构造二叉树要用前序遍历。原创 2024-03-14 20:05:29 · 325 阅读 · 1 评论 -
代码随想录day21| 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
因为二叉搜查树是一个有序的,所以可以将存入一个数组里面,然后我们不断去对比。原创 2024-03-14 19:53:35 · 327 阅读 · 1 评论 -
代码随想录day18| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树
—由于后序,所以说该数组的最后一个是父结点,然后再从中序中,找到左右子树,找到后,就不断分割数组;先在后序数组中将根结点找出,然后在中序数组中以根结点位置,左右分割两个数组,左为左子树,右为右子树。题目给了两个数组,一个是后序,一个是中序,——停止条件是当中序数组的长度为零的时候,后续和中序数组的作用。原创 2024-03-12 20:21:48 · 289 阅读 · 1 评论 -
代码随想录day17| 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和
为什么判断父结点的情况,而不是子结点的情况,因为遍历到子结点的的时候,不知道遍历到的是左结点还是右结点,所以就要用到判断条件就是父结点的左结点的左右结点为空的时候。——用后续遍历的原因其实是单层遍历如何写,这道题目中我们是,先处理了左结点,然后到右结点,最后才到父节点的。——一开始没有认真看题目,题目的要求是从根结点到根的所有路径, 所以我们遍历到最后面就要开始返回了。——因为栈是先进后出的原因,保证了路线不会错乱。思路:求高度用后续遍历,深度用后续遍历,——当前遍历的子结点左右指针都是空的。原创 2024-03-11 20:32:48 · 326 阅读 · 0 评论 -
代码随想录day16|104.二叉树的最大深度、 111.二叉树的最小深度 、 222.完全二叉树的节点个数
【代码】代码随想录day16|104.二叉树的最大深度、 111.二叉树的最小深度 、 222.完全二叉树的节点个数。原创 2024-03-10 20:26:16 · 209 阅读 · 1 评论 -
代码随想录day15|二叉树层序遍历、 226.翻转二叉树、101. 对称二叉树
代码实现思路:先检查二叉树是否为空,然后初始化数组以及分配内存,然后就左结点入队然后到右结点入队。——要先比较左右两个子结点的情况,然后再比较父结点的情况。这里其实就是在一个数组里面实现两个元素互换。为什么要用到后序遍历。原创 2024-03-09 20:16:10 · 208 阅读 · 0 评论 -
代码随想录day14|144. 二叉树的前序遍历、145. 二叉树的后序遍历、94.二叉树的中序遍历
前序(因为是处理父结点,所以指针一直指向左边,到了尽头了,再返回处理)二叉树的前后中遍历顺序:其实是父节点处理的顺序,——例如:前序遍历就是父结点然后左到右。原创 2024-03-07 22:08:53 · 274 阅读 · 1 评论 -
代码随想录day12| 239. 滑动窗口最大值、 347.前 K 个高频元素
实现思路:用一个单调队列实现,单调队列出口是存放每个窗口的最大值,每结束一次窗口,就pop出出口元素,放入放回数组中,原创 2024-03-06 20:44:58 · 832 阅读 · 1 评论 -
代码随想录day11| 20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、 150. 逆波兰表达式求值
—这里其实已经隐藏了删除的操作,假如说前面的没有重复的元素,那么由于后加加的操作,只会将原本的元素复制,假如前面是有出现的重复的元素,那么新的元素就给旧的覆盖,然后实现删除的操作。——因为代码中使用了后加加的操作,所以说stackTop其实是指向了下一位元素了。为什么要写 char letter = s[slow] = s[fast++];这道题可以看作是移除元素的题目,与数组不一样的地方是字符串以'\0'结尾的,——栈的长度为零了,还有字符串中右方向括号还没有遍历完。——字符与栈顶元素不匹配。原创 2024-03-05 21:12:17 · 323 阅读 · 0 评论 -
代码随想录day10|232.用栈实现队列 、225. 用队列实现栈
【代码】代码随想录day10|232.用栈实现队列 、225. 用队列实现栈。原创 2024-03-03 19:28:25 · 225 阅读 · 1 评论 -
代码随想录09|kmp算法
—因为第一个指针不动,第二个指针是取第一个指针前一个的最长相等前后缀第二个指针的起始位置,这个长度实际是指第二个指针在模式串跳过多少个元素后进行比较,因为是相等前后缀的原因,所以说,这跳过的x个元素,必定会和第一指针前的x个元素相等。——一个指针是文本字符串的,另外一个是模式字符串的,而暴力解法中呢,就是第一个指针不是一直往前走,而是遇到不同的时候,两个指针都往回跳,——我们需要一个前缀表来记录,每一个字符串的最长相等前后缀(的长度)是多少,我们要看不相同元素的前一个元素的最长相等前后缀是多少,原创 2024-03-02 18:28:37 · 322 阅读 · 0 评论 -
代码随想录day07| 454.四数相加II、 383. 赎金信 、 15. 三数之和 、 18. 四数之和
—因为数组内的元素范围很大,所以不可以将将元素映射到数组里面,数组的大小难以确定,并且会浪费大量的内存,然后不仅要储存元素,还要储存出现的次数,所以选择使用map,而不使用set,思路:和有效字母异位的解题大体一样,但是,这道题是将两个数组都变成哈希表,然后才进行比较他们的值,如果ransomNote大于magazine,那么就返回false,——前者是向前检查是否有重复,而后者相反,题目要求的是没有重复的三元组,但是里面的元素是可以相同的,所以如果是向后去重的话,那么就有些情况被删去了。原创 2024-02-28 15:08:30 · 676 阅读 · 0 评论 -
代码随想录day06|242.有效的字母异位词 349. 两个数组的交集、202. 快乐数 、 1. 两数之和
思路二:用双指针,为什么可以用双指针,因为可以将每一次的sum放入链表中,如果是是循环的化,那么就会形成环链,在链表中,学习到了如何找一个环链的入口,所以说这道题可以通过双指针的方法来解决。先将一个数组变成哈希表,然后将另外一个映射到哈希表上,如果哈希表上有这个,那么就将它移动出来,到新的数组内。思路1:要将每一次的结果给记录下来,当有结果再次重复的时候,说明是循环的了,所以用到哈希表。原创 2024-02-26 23:16:50 · 588 阅读 · 1 评论 -
代码随想录day04| 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交 、 142.环形链表II
—因为他们有一段共同的长度,所以说,他们相差的那一段中不可能有相同的元素。为什么要对齐链表长度后才进行比较,相差的那一段为什么不会有相同的。原创 2024-02-24 22:46:40 · 167 阅读 · 0 评论 -
数组总结。
二分法:根据是否满足题目的条件来缩小答案所在的区间,这个就是二分的本质。数组的内存是连续的,想要得到连续的数组,就不可以直接删除其中的元素。双指针:要根据题目的条件来确定快慢指针的位置,循环的条件。原创 2024-02-22 22:55:34 · 135 阅读 · 1 评论 -
代码随想录day02|977.有序数组的平方 、 209.长度最小的子数组、 59.螺旋矩阵II
总结:滑动窗口中,要考虑滑动窗口是如何移动的。看到最大值,可以使用动态变化,可以使用三元表示法,最值初始化时,可以使用头文件带的最值。我的错误:想将所有的长度放在一个数组里,然后再进行比较,而且没有完全将所有的可能考虑到。对c语言还不是很熟练。总结:如何使用双指针是看题目的需求,这道题用双指针的思路和归并排序的思路相类似。总结:螺旋矩阵最重要的就是区间的选择。原创 2024-02-22 22:37:32 · 1629 阅读 · 0 评论 -
代码随想录day01|704.二分查找 、27移除元素
错误和分析:我将数组从中间分成两半,然后这个中间值作为左右两个边界了,应该是先用二分法找出第一个出现的目标值,然后再根据找哪个边界值然后才进行下一个二分法。虽然我的想法是这个的,但是我的代码还是先是将中间值作为了边界值。双指针:慢指针是指向数组位置,快指针是指向数值,将原来的数组当作空白的数组,只要不是删除值,那么就将它复制数组中。——当while循环后,还没有找到的话,证明目标值不在区间内,而middle是区间内的值。数组理论知识:数组在内存上是连续的,不可以通过删除移除元素,只可以通过覆盖元素。原创 2024-02-21 13:47:21 · 1646 阅读 · 0 评论