- 博客(60)
- 收藏
- 关注
原创 代码随想录训练营Day41 | 1049. 最后一块石头的重量 II | 494. 目标和 | 474.一和零
先用 二维 dp数组求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);递推公式:dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];以输入:["10","0001","111001","1","0"],m = 3,n = 3为例。
2024-10-23 09:49:27
732
原创 代码随想录训练营Day39 | 01背包问题 二维 | 01背包问题 一维 | 416. 分割等和子集
这里dp[i][j]是由dp[i-1][j],与。
2024-10-21 14:17:06
628
原创 代码随想录训练营Day38 | 62.不同路径 | 63. 不同路径 II | 343. 整数拆分 | 96.不同的二叉搜索树
2.确定递推公式:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。注意dp[i][j]表示从(0 ,0)出发,到(i, j)的所有路径,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。4.确定遍历顺序:递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。
2024-10-19 20:47:09
622
原创 代码随想录训练营Day36 | 56. 合并区间 | 738.单调递增的数字 | 968.监控二叉树 (可跳过)
都是一个套路,都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。可以举例98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。的最大数字,且数字呈。
2024-10-17 18:57:31
511
原创 代码随想录训练营Day35 | 452. 用最少数量的箭引爆气球 | 435. 无重叠区间 | 763.划分字母区间
当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。
2024-10-16 15:28:18
1061
原创 代码随想录训练营Day34 | 134. 加油站 | 135. 分发糖果 | 860.柠檬水找零 | 406.根据身高重建队列
整个插入过程如下:排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
2024-10-15 11:13:44
753
原创 代码随想录训练营Day32 | 122.买卖股票的最佳时机II | 55. 跳跃游戏 | 45.跳跃游戏II | 1005.K次取反后最大化的数组和
给你一个整数数组 ,其中 表示某支股票第 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例 1:输入:prices = [7,1,5,3,6,4]输出:7解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6
2024-10-13 16:22:40
929
原创 代码随想录训练营Day31 | 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和
这类输出结果为2,不能将perDiff = curDiff 每次循环改变perDiff,preDiff没有必要跟着curDiff去实时更新,只需要在坡度有变化时,记录坡度方向,当坡度方向改变后才改变。2.两个元素[1,2],这种无法直接计算preDiff与curDiff,需要假设其为[1,1,2],再进行处理,这样就是输出结果为2,只需要将preDiff默认设置为0即可。其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。
2024-10-12 17:18:36
606
原创 代码随想录训练营Day30 | 491.递增子序列 | 46.全排列 | 47.全排列 II
可以看出叶子节点,就是收割结果的地方。当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
2024-10-11 10:36:27
1241
原创 代码随想录训练营Day29 | 93.复原IP地址 | 78.子集 | 90.子集II
本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。(也可以放到递归函数参数里),递归函数参数在上面讲到了,需要startIndex。(因为当逗点为3时,就表明已经切割为四段,回溯结束)也就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。区别就是集合里有重复元素了,而且求取的子集要去重。,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。
2024-10-10 15:51:04
902
原创 代码随想录训练营Day28 | 39. 组合总和 | 40.组合总和II | 131.分割回文串
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。该题相较于前面的组合题目,就是元素可以重复取值,1 <= candidates[i] <= 200,但是有总和的限制,所以间接的也是有个数的限制。如上图,我们先将数组排序,使得重复数相邻,这样去递归遍历时,前一个重复数必然包括后一个重复数的所有结果集合,这样使用树层去重,跳过后一个重复树的递归即可。要涉及到去重,如果先求组合,再使用set或者map去重,会超时。
2024-10-09 10:26:15
794
原创 代码随想录训练营Day27 | 77. 组合 | 216.组合总和III | 17.电话号码的字母组合
这颗树的初始集合就是[1,2,3,4],从左往右取数,取过的数就不再取,避免出现重复集合,每个节点需要一个for循环来遍历,所以需要一个startindex来控制遍历的起始值,需要用一维数组来存放结果,用二维数组来存放所有满足的结果。图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。这题相对于上一题就是多了一个限制,要找到和为n的k个整数,整个集合是固定的。
2024-10-08 14:41:21
896
原创 代码随想录训练营Day26 | 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。取哪一个都可以,只不过构成了不同的平衡二叉搜索树。节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。通过修剪二叉搜索树,使得所有节点的值在。
2024-10-06 23:15:11
1036
原创 代码随想录训练营Day19 | 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点
利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。返回插入后二叉搜索树的根节点。另一个正确答案是 [5,2,6,null,4,null,7]。
2024-10-02 17:11:16
755
原创 代码随想录训练营Day18 | 654. 最大二叉树 | 617. 合并二叉树 | 700.二叉搜索树中的搜索 | 98.验证二叉搜索树
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。
2024-09-28 18:02:12
878
原创 代码随想录训练营Day17 | 530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 | 236. 二叉树的最近公共祖先
在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。这题是在二叉搜索树上找众数,二叉搜索树中序遍历是有序的,对二叉搜索树中序遍历后,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。
2024-09-27 21:09:42
646
原创 代码随想录训练营Day16 | 513.找树左下角的值 | 112. 路径总和 | 106.从中序与后序遍历序列构造二叉树
切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。如何通过两个顺序构造一个唯一的二叉树,就是以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组,一层一层切下去,每次后续数组的最后一个元素就是节点元素。难点:如何切割,边界值的确定,此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
2024-09-26 19:42:20
631
原创 代码随想录训练营Day15 | 222.完全二叉树的节点个数 | 110.平衡二叉树 | 257. 二叉树的所有路径 | 404.左叶子之和
因为要先处理中间节点,中间节点是需要记录的路径上的节点,先放进path中,然后就是处理左右节点,如果cur为空 就不再递归,然后还需要做回溯操作,当到达二叉树中一条边的尽头时,还要删除节点,然后从才能加入新的节点。3.确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。1.确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。
2024-09-25 21:21:33
967
原创 代码随想录训练营Day14 | 226.翻转二叉树 | 101. 对称二叉树 | 104.二叉树的最大深度 | 111.二叉树的最小深度
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。3.确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。因为要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数就是左子树和右子树。1.确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
2024-09-24 16:43:45
943
原创 代码随想录训练营Day13 | 二叉树理论基础 | 递归遍历 | 迭代遍历 | 统一迭代 | 层序遍历
int val;二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。
2024-09-23 21:33:09
549
原创 代码随想录训练营Day11 | 150. 逆波兰表达式求值 | 239. 滑动窗口最大值 | 347.前 K 个高频元素
这是使用单调队列的经典题目,此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。队列里的元素一定是要排序的,而且要最大值放在出队口,那么已经排序之后的队列 怎么能把窗口要移除的元素(这个元素可不一定是最大值)弹出呢。的滑动窗口从数组的最左侧移动到数组的最右侧。
2024-09-21 17:22:00
1042
原创 代码随想录训练营Day10 | 栈与队列理论基础 | 232.用栈实现队列 | 225. 用队列实现栈 | 20. 有效的括号 | 1047. 删除字符串中的所有相邻重复项
最后,将。
2024-09-20 10:29:15
954
原创 代码随想录训练营Day9 | 151.翻转字符串里的单词 | 卡码网:55.右旋转字符串 | 字符串总结 | 双指针回顾
给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。中,一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,
2024-09-19 10:49:28
1061
原创 代码随想录训练营Day8 | 344.反转字符串 | 541. 反转字符串II | 卡码网:54.替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。串和数组有什么差别,字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
2024-09-18 14:42:10
903
原创 代码随想录训练营Day7 | 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。接下来如何移动left 和right呢,
2024-09-17 10:52:13
996
原创 代码随想录训练营Day6 | 哈希表理论基础 | 242.有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 | 1. 两数之和
1)遇到快速判断一个元素是否出现在集合中(判断一个元素是否出现过),就考虑使用哈希表。2)要熟悉哈希表的三种常见结构,明确什么时候使用哪一种。
2024-09-16 15:24:10
831
原创 嵌入式Linux笔试题目
答案:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。
2024-09-15 15:12:11
4809
原创 代码随想录训练营Day4 | 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 | 142.环形链表II
在while循环中的判断条件,因为在操作节点时是去操作cur->next 与 cur->next->next 要判断不为空,而且这样也可以保证,遍历到最后如果是奇数节点也会停止交换。1.先判断链表是否有环:双指针(快慢指针)从头节点出发两个指针,快指针一次走两步,慢指针一次走一步,如果快指针和慢指针相遇,就说明链表有环存在;为了方便举例,假设节点元素数值相等,则节点指针相等。快慢指针(双指针),先让快指针走K步,然后两个指针同步走,当快指针走到头时,慢指针就是链表倒数第K个节点。
2024-09-14 19:48:33
866
原创 代码随想录训练营Day3 | 链表理论基础 | 203.移除链表元素 | 707.设计链表 | 206.反转链表
单链表的定义 (特别注意,在面试中可能需要自己定义链表// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数。
2024-09-13 20:23:49
824
原创 代码随想录训练营Day2 | 209.长度最小的子数组 | 59.螺旋矩阵II | 58. 区间和
1. 学习滑动窗口2.学习标准输入输出模式3.学习文档数组总结。
2024-09-12 18:56:42
1221
原创 代码随想录训练营Day1 | 数组理论基础 | 704. 二分查找 | 27. 移除元素 | 977.有序数组的平方
本来定义的时候right就是指向数组末尾之后的一个值,为了保证逻辑一致,将right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]由于数组在内存空间的地址时连续的,所以在删除或者添加元素时,就需要移动其他元素的地址;在左闭右开区间,除了改变right的初始化与while的判断条件以外,在更新right时也不需要。数组内存空间的地址是连续的。
2024-09-11 10:26:22
758
1
原创 Ubuntu18.04安装MySQL5.7.29
解压压缩包 tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar。选择5.7.29版本 Ubuntu Linux系统 版本是18.04(64-bit)需要安装 sudo apt-get install libaio1。解压结束 会出现几个deb文件。下载第一个DEB Bundle。可以检查是否安装成功。
2024-06-04 14:18:38
1573
原创 Leetcode 21. 合并两个有序链表
解题方法:由于两个都是升序链表,所以可以开辟一个新的链表,然后同时遍历两个链表,比较链表元素的大小,将小的节点链接到新的链表中,最后,会存在一个链表先遍历完,然后将没有遍历完的链表全部放在新链表之后即可。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。
2024-05-20 21:03:01
533
原创 Leetcode 876. 链表的中间结点
题目描述给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。[3,4,5]链表只有一个中间结点,值为 3。[4,5,6]该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。这题也是使用双指针方法(快慢指针)当快指针到达链表末尾时,慢指针正好指向链表的中间节点。NOTE:题目要求:「两个中间结点的时候,返回第二个中间结点」。快指针可以前进的条件是:当前快指针和当前快指针的下一个结点都非空。
2024-05-20 20:56:32
437
原创 Leetcode 面试题 02.01. 移除重复节点
双指针方法,定义两个指针cur与p来逐个遍历链表,cur元素依次和p比较,直到p为NULL,cur向后移动一个。编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
2024-05-20 20:19:38
324
原创 Leetcode 面试题 02.07. 链表相交
在链表相交的问题中,当两个链表相交于某个节点,这意味着从那个交点开始,两个链表共享所有后续节点,形成了一个共同的尾部。从这个交点开始,不再是两条独立的链表,而是转变为一个共享的尾部。并且要注意,交点之后的节点是完全相同的,也就是说这个交点后,两个链表共用节点,也就变味了一个链表(所以也不会出现交点之后又分离的状态)从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
2024-05-13 21:59:42
638
原创 Leetcode 19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。[1,2,3,5][][1]思路:使用双指针,因为要删除倒数第n个节点,就需要将一个指针,指向这个节点的前一个节点,可以在链表前定义虚拟头节点,这样使得删除节点操作统一,不需要区分是不是头节点;
2024-05-13 21:29:05
359
1
原创 Leetcode 24. 两两交换链表中的节点
如图所示我们需要交换1->2这两个节点 ,需要改变cur->next ,cur->next->next ,cur->next->next;我们可以想象为重新构造一个链表,那肯定分别要给cur->next ,cur->next->next ,cur->next->next赋值,这样循环 直到cur->next ,cur->next->next 不为空 因为要交换这两个节点,所以这两个节点不能为空。修改cur->next->next是因为本来是2->3 现在变为了1->3 所以也需要修改 最后变为2->1;
2024-05-09 21:30:12
348
原创 Leetcode 206. 反转链表
给你单链表的头节点head,请你反转链表,并返回反转后的链表。[2,1]head = [][]题目想要实现的效果 如图所示:之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。
2024-05-09 20:42:30
408
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人