![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
hot100
DarkFlameMaster2188
这个作者很懒,什么都没留下…
展开
-
437. 路径总和 III
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。本题采用遍历每个节点开始的路径的思路,递归所有可能的结果,然后把总数加起来。原创 2024-07-19 10:18:14 · 110 阅读 · 0 评论 -
114. 二叉树展开为链表
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。展开后的单链表应该与二叉树 先序遍历 顺序相同。原创 2024-07-18 11:13:14 · 157 阅读 · 0 评论 -
230. 二叉搜索树中第K小的元素
但我们可以不遍历整棵树,使用中序遍历(迭代算法),使用栈存放节点。首先向左子树遍历,遍历到root为空,然后回溯,再遍历右子树,这样保证了迭代数值的大小。给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。本题我原本的思路是将所有的节点按大小存入数组中,然后返回第k个值。原创 2024-07-17 21:47:33 · 184 阅读 · 0 评论 -
146. LRU 缓存
2.对于 put 操作,首先判断 key 是否存在:如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。上述各项操作中,访问哈希表的时间复杂度为 O(1),在双向链表的头部添加节点、在双向链表的尾部删除节点的复杂度也为 O(1)。如果 key 存在,则 key 对应的节点是最近被使用的节点。原创 2024-07-17 09:53:55 · 299 阅读 · 0 评论 -
138. 随机链表的复制
深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。本题利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。原创 2024-07-16 22:24:30 · 288 阅读 · 0 评论 -
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。本题我采用重新建立一个链表来储存结果,链表节点值等于两个链表值的相加,并考虑是否进位。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。请你将两个数相加,并以相同形式返回一个表示和的链表。原创 2024-07-15 17:29:54 · 160 阅读 · 0 评论 -
142. 环形链表 II
那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。因为要找环形的入口,那么要求的是x,因为x表示 头结点到 环形入口节点的的距离。当 n为1的时候,公式就化解为 x = z,这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。如果链表无环,则返回 null。原创 2024-07-15 11:13:30 · 224 阅读 · 0 评论 -
240. 搜索二维矩阵 II
我们可以从矩阵 matrix 的右上角 (0,n−1) 进行搜索。编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。在搜索的过程中,如果我们超出了矩阵的边界,那么说明矩阵中不存在 target。原创 2024-07-14 16:47:01 · 119 阅读 · 0 评论 -
48. 旋转图像
如上图所示,一轮可以完成矩阵 4 个元素的旋转。因而,只要分别以矩阵左上角 1/4 的各元素为起始点执行以上旋转操作,即可完整实现矩阵旋转。给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。具体来看,当矩阵大小。原创 2024-07-14 16:01:11 · 164 阅读 · 0 评论 -
54. 螺旋矩阵
2.其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理。3.判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案。5.不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案。1.首先设定上下左右边界。原创 2024-07-14 15:04:29 · 124 阅读 · 0 评论 -
73. 矩阵置零
本题用两个标记数组分别记录每一行和每一列是否有零出现。首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后再次遍历该数组,用标记数组更新原数组即可。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。请使用 原地 算法。原创 2024-07-14 14:29:43 · 180 阅读 · 0 评论 -
41. 缺失的第一个正数
因此,对数组进行遍历,对于遍历到的数 x,如果它在 [1,N] 的范围内,那么就将数组中的第 x−1 个位置(注意:数组下标从 0 开始)打上「标记」。在遍历结束之后,如果所有的位置都被打上了标记,那么答案是 N+1,否则答案是最小的没有打上标记的位置加 1。注意如果它已经有负号,不需要重复添加;这是因为如果 [1,N] 都出现了,那么答案是 N+1,否则答案是 [1,N] 中没有出现的最小正整数。3.在遍历完成之后,如果数组中的每一个数都是负数,那么答案是 N+1,否则答案是第一个正数的位置加 1。原创 2024-07-14 13:47:28 · 183 阅读 · 0 评论 -
238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。本题使用三个数组,L用来记录i左侧所有元素的乘积,R来记录右侧所有元素的乘积,answer记录结果。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。,且在 O(n) 时间复杂度内完成此题。原创 2024-07-14 11:49:43 · 205 阅读 · 0 评论 -
189. 轮转数组
因此可以先将所有元素翻转,这样尾部的 k mod n 个元素就被移至数组头部,然后我们再翻转 [0, (k mod n) − 1 ] 区间的元素和 [k mod n, n − 1 ] 区间的元素即能得到最后的答案。用 n 表示数组的长度,遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置,最后将新数组拷贝至原数组即可。但是翻转数组来得到结果会更加容易,当将数组的元素向右移动 k 次后,尾部 k mod n 个元素会移动至数组头部,其余元素向后移动 k mod n 个位置。原创 2024-07-13 21:18:24 · 208 阅读 · 0 评论 -
56. 合并区间
请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。(相邻区间也算重叠)本题和前面几道题思路相似,都是判断区间重叠,但重叠后的具体操作不同,本题需要合并区间,我原本想通过两个int型变量来记录合并区间的开始位置和终止位置,若不重叠则存放结果,但导致当前不重叠区间没有存放进结果中,所以错误。正确思路应该是,将区间存入结果数组中,若区间重叠,则更改数组中最后一个区间的终止位置,改为两者中的最大值,若区间不重叠,则将新的区间存入数组中,这样就更新了下一区间的起始和终止位置。原创 2024-06-24 11:13:41 · 222 阅读 · 0 评论 -
76. 最小覆盖子串
本题的思想是哈希+滑动窗口,使用哈希构建sStr(s子串中字符出现次数)和tStr(t字符串中字符出现次数),如果sStr能够覆盖tStr,则当前子串符合条件,记录当前子串左端位置和长度,以便最后分割子串,并将子串左端位置右移一位;如果不能覆盖,则将子串右端位置右移一位。给你一个字符串 s 、一个字符串 t。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”。原创 2024-07-13 10:47:08 · 161 阅读 · 0 评论 -
560. 和为 K 的子数组
在遍历的过程中,我们检查是否存在Sum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。那么对于任意的两个下标i和j(i < j),如果Sum[j] - Sum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。子数组是数组中元素的。原创 2024-07-12 17:07:06 · 111 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。本题我原本的思路是遍历s的下标,然后截取p长度的子串和p进行比较,但超出时间限制。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。原创 2024-07-12 13:14:30 · 159 阅读 · 0 评论 -
3. 无重复字符的最长子串
若ringht所指字符未出现过,则将当前子串长度与最长子串长度作对比,然后把当前字符加入set容器中,right右移。本题采用滑动窗口法解题,left指向子串左端,right指向子串右端,使用set容器记录出现过的字符。若right所指字符出现过,则将left所指字符从容器中删除,left右移。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。原创 2024-07-11 21:22:15 · 123 阅读 · 0 评论 -
15. 三数之和
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!原创 2024-07-11 14:02:20 · 130 阅读 · 0 评论 -
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。本体采用双指针法,刚开始左右指针分别指向左右两端,然后移动两者中较小的那个数。因为容器的高等于两者中较小的数,容器的宽等于两者下标的差值,若移动较大的数,则宽小于之前的宽,高小于等于之前的高,容器值只会越来越小,所以移动较小的那个数。原创 2024-07-11 13:43:13 · 182 阅读 · 0 评论