LeetCode 热题100道
文章平均质量分 64
LeetCode 热题100道
转调
这个作者很懒,什么都没留下…
展开
-
每日一练:验证二叉搜索树
遍历每一个节点的左子树和右子树,因为题目要求左子树的每个节点的值一定比根小,所以递归左子树时,每个节点必须比root->val小,右子树的每个节点的值比根大,所以递归右子树时,每个节点必须比root->val大。根据题目描述,左小根中等右大,那么二叉搜索树的中序遍历一定是一个递增的序列,所以写一个中序遍历,判断当前值是否小于前一个值即可。根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。原创 2024-09-26 15:22:43 · 331 阅读 · 0 评论 -
每日一练:合并K个升序链表
首先我们需要一个函数来合并有序链表,然后遍历数组,让前两个链表合并后放到第二个链表的位置,下次循环时又让排序好的链表和第三个链表合并,新链表又放到第三个链表的位置,以此类推,直到所有链表合并好后返回最后一个位置的链表即可。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。将它们合并到一个有序链表中得到。原创 2024-09-21 19:29:29 · 286 阅读 · 0 评论 -
每日一练:将有序数组转换为二叉搜索树
走到叶节点时,叶节点的一下次递归返回nullptr,然后叶节点就是最小的子树作为次小的子树的根,以此类推。每次递归使用中值作为子树的根,根的左边是左子树,根的右边是右子树,以此作为分治的依据。[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。排列,请你将其转换为一棵。原创 2024-09-24 23:21:25 · 302 阅读 · 0 评论 -
每日一练:K个一组翻转链表
先递归(外层递归)到最后一个要进行反转的部分,进行递归反转(内层递归)后,得到它的新头后返回上一层递归(外层递归);上一层递归是前一个要进行反转的部分,这部分又进行递归反转后将新尾连接到上一次返回的新头即可。新尾就是旧头,我们可以在外层递归时保存这个节点,得到后一部分的新头后指向它。新头就是旧尾,要返回给调用它的上一次函数,也就是链表的前一部分。是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。个节点一组进行翻转,请你返回修改后的链表。原创 2024-09-13 18:55:09 · 447 阅读 · 0 评论 -
每日一练:二叉树的直径
因为题目说到最长路径可能不经过根节点,所以递归每个节点的左右子树,得到它们的高度,如果加起来大于ret,就更新ret,然后返回上一个节点的高度。3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。这条路径可能经过也可能不经过根节点。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。由它们之间边数表示。原创 2024-09-23 22:44:06 · 305 阅读 · 1 评论 -
每日一练:翻转二叉树
使用递归,将最小子树的左右节点进行交换后,再交换次级子树的左右节点,一直交换到根节点即可。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。原创 2024-09-23 19:39:26 · 239 阅读 · 0 评论 -
每日一练:二叉树的最近公共祖先
再找第二个节点的路径,方法相同,但是一旦发现m[root] == 2,说明该节点就是最近祖先,因为1是上个节点的路径,2就是共同的路径。题目说了没有重复节点,那么我们就可以找每一个节点之下的路径是否包含q和p,如果都包含就说明这个节点是公共祖先,又因为递归是从后往前操作节点的,那么找到的第一个公共祖先就是最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(因为根据定义最近公共祖先节点可以为节点本身。原创 2024-09-29 14:41:35 · 243 阅读 · 0 评论 -
每日一练:路径总和Ⅲ
不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。使用两层递归遍历所有路径,第一层递归枚举所有节点,并以它们为路径起点;第二层递归以第一层递归的节点为起点向下累加,相等就使结果加1;和等于 8 的路径有 3 条,如图所示。,求该二叉树里节点值之和等于。给定一个二叉树的根节点。原创 2024-09-28 22:15:44 · 190 阅读 · 0 评论 -
每日一练:二叉树中的最大路径和
(3)得到左右子树最大路径和的最大值,如果该值+根的值大于0,就把这个值返回回去,因为这个值又是上一个根的左子树或者右子树的最大路径和,小于0就返回0。被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。(2)如果左子树、右子树、根之和大于最大值,则更新最大值(可能是最大的结果)最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。节点,且不一定经过根节点。是路径中各节点值的总和。原创 2024-09-29 14:50:00 · 307 阅读 · 0 评论 -
每日一练:二叉树的中序遍历
中序遍历的次序是 左-根-右,使用递归很简单就能写出来。递归算法很简单,你可以通过迭代算法完成吗?给定一个二叉树的根节点。原创 2024-09-23 19:16:24 · 153 阅读 · 0 评论 -
每日一练:随机链表的复制
根据first找到相应原节点的副本,first的next、random原本就指向下一个first节点,second指向相应节点的second即可。使用一个map哈希表,first保存原节点,second构造一个复制节点,目前只复制val;指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。原创 2024-09-15 20:02:06 · 343 阅读 · 0 评论 -
每日一练:岛屿数量
再写一个感染递归函数infect,只要发现没有归属的土地就以它为起点"感染"周围的土地,即让它们合并成一个岛屿;创建一个数组tab,用来记录grid中的1是否已经有归属,如果是0表示没有归属;岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(水)组成的的二维网格,请你计算网格中岛屿的数量。此外,你可以假设该网格的四条边均被水包围。原创 2024-09-29 16:09:08 · 307 阅读 · 0 评论 -
每日一练:二叉树的层序遍历
队列是一种先进先出的容器,本题需要使用两个队列,q1用来操作当前层的节点,节点存在就把值放到ret中,然后把这个节点的左右节点按顺序放在q2中,该节点出队列;节点为空就直接出队列,操作下一个节点。给你二叉树的根节点 root ,返回其节点值的 层序遍历。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]树中节点数目在范围 [0, 2000] 内。输入:root = [1]二、解法1-队列 O(N)输入:root = []原创 2024-09-25 10:38:37 · 292 阅读 · 0 评论 -
每日一练:二叉搜索树中第K小的元素
二叉搜索树最重要的特性是左子树的所有节点比根小,右子树的所有节点比根大,那么它的中序遍历一定是一个升序的序列,就不需要额外排序了,将上述的插入顺序改为中序遍历。二叉搜索树的一个特征是没有重复的元素,我们可以利用这个特点,把所有的节点值插入一个数组容器中,排序后下标为k-1的元素就是第k小的元素。解法1对任意一颗二叉树都能找到第K小的元素,不论是否是二叉搜索树。如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第。小的元素(从 1 开始计数)。给定一个二叉搜索树的根节点。原创 2024-09-26 16:24:32 · 297 阅读 · 0 评论 -
每日一练:二叉树的右视图
从最右路径遍历,然后遍历次右路径,最后遍历最左路径,如果某条路径比它所有右边路径中的最长路径还要长,那么多出来的节点就是右视图能看见的,将其加入结果中。这个题可以用层序遍历来完成,但是方向是从右向左进行,只将每层的第一个节点放入数组中。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。原创 2024-09-26 22:20:16 · 429 阅读 · 0 评论 -
每日一练:排序链表
归并排序的思想是对半分解链表,直到只有一个节点时返回,返回后有两条链表,每条链表一个节点,此时它们是有序的,使用合并有序链表的函数进行合并排序,结果的这一条链表也是有序的,然后再次返回,继续和其他有序链表进行合并排序;需要注意的是,递归过程中每次分解链表时,除了找到后半部分的头,还要使前半部分的尾节点指向nullptr,因为这样才能使用合并有序链表的函数。大堆的概念是根大于等于左右节点的二叉树,所以大堆的根一定是最大的,只要把所有节点插入大堆,然后一个一个的将根提取出来尾插即可。原创 2024-09-16 08:46:56 · 308 阅读 · 0 评论 -
每日一练:从前序遍历与中序遍历序列构造二叉树
然后在p中找第二个元素,根据前序遍历根左右的顺序,这个元素一定是左子树的根,然后继续在i中找到它,它的左(不低于0,小于上个根)右(不大于结尾,大于上个根)边,也是它的左右子树。题目说preorder序列(简称p)是前序遍历,inorder(简称i)是中序遍历,那么先从 p 中找到第一个元素,然后找到这个元素在 i 中的位置。在i中以这个位置为界限,根据中序遍历左根右的顺序,这个位置左边的数组构成它的左子树,右边构成它的右子树。,请构造二叉树并返回其根节点。原创 2024-09-28 16:27:09 · 276 阅读 · 0 评论 -
每日一练:二叉树的最大深度
使用递归,如果遇到空就返回0,否则返回这个节点的子树最大高度+1(这个节点本身的高度)。是指从根节点到最远叶子节点的最长路径上的节点数。原创 2024-09-23 19:32:15 · 271 阅读 · 0 评论 -
每日一练:二叉树展开为链表
(3)cur更新到当前节点,节点左边置空。(4)继续递归左,再递归右。(1)保存节点的左右节点。(2)将节点连接到链表中。额外空间)展开这棵树吗?你可以使用原地算法(原创 2024-09-28 15:36:15 · 298 阅读 · 0 评论 -
每日一练:对称二叉树
迭代需要我们维护一个栈,每次循环查看栈顶的两个节点是否对称,如果对称且不为空,就插入这两个节点的四个子节点;如果为空说明走到尾了,就不插入。使用递归,从根开始比较左右两边的节点的val是否相同。你可以运用递归和迭代两种方法解决这个问题吗?给你一个二叉树的根节点。, 检查它是否轴对称。原创 2024-09-23 20:43:22 · 307 阅读 · 0 评论 -
每日一练:最大子数组和
给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。6连续子数组 [4,-1,2,1] 的和最大,为 6。nums = [1]123如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的求解。原创 2024-09-08 09:25:33 · 236 阅读 · 1 评论 -
每日一练:缺失的第一个正数
给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。3范围 [1,2] 中的数字都在数组中。21 在数组中,但 2 没有。1最小的正数 1 没有出现。原创 2024-09-09 21:29:57 · 200 阅读 · 0 评论 -
每日一练:矩阵置零
给定一个m x n的矩阵,如果一个元素为,则将其所在行和列的所有元素都设为。请使用算法O(mn)O(m + n)摘自LeetCode。原创 2024-09-09 22:46:47 · 375 阅读 · 0 评论 -
每日一练:合并区间
以数组intervals表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].[[1,5]]区间 [1,4] 和 [4,5] 可被视为重叠区间。原创 2024-09-08 17:29:34 · 400 阅读 · 0 评论 -
每日一练:螺旋矩阵
可以发现矩阵每次旋转360°,矩阵就会少最外面那一层,我们可以把这个表现为上下左右的边界都减少1。(3)经过(2)之后外面层就添加完了,然后缩小边界,去掉外层。需要注意的是当前边界的四个角不要重复添加到 ret 中了。(1)用4个变量代表矩阵的上下左右边界,并赋初始值;(4)循环(2)(3)直到全部添加完。二、解法1-设定边界 O(M*N),返回矩阵中的所有元素。摘自LeetCode。原创 2024-09-09 23:51:35 · 361 阅读 · 0 评论 -
每日一练:轮转数组
给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。向右轮转 1 步:向右轮转 2 步:向右轮转 3 步:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]O(1)原创 2024-09-09 15:48:48 · 338 阅读 · 0 评论 -
每日一练:最小覆盖字符串
给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。tts"BANC"最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。"a"整个字符串 s 是最小覆盖子串。""t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。t。原创 2024-09-07 21:28:13 · 199 阅读 · 0 评论 -
每日一练:除自身以外数组的乘积
给你一个整数数组nums,返回 数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据数组nums之中任意元素的全部前缀元素和后缀的乘积都在整数范围内。请且在O(n)时间复杂度内完成此题。nums =[1,2,3,4]nums你可以在O(1)的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组额外空间。原创 2024-09-09 17:07:09 · 458 阅读 · 0 评论 -
每日一练:无重复字符的最长字串
给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子串是"abc",所以其长度为 3。1因为无重复字符的最长子串是"b",所以其长度为 1。3因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke"是一个子序列,不是子串。原创 2024-09-06 07:44:38 · 519 阅读 · 0 评论 -
每日一练:滑动窗口最大值
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。滑动窗口的位置 最大值[1]遍历数组,得到每一次滑动窗口的最大值。原创 2024-09-07 15:42:42 · 381 阅读 · 0 评论 -
每日一练:找到字符串中所有字母异位词
给定两个字符串s和p,找到s中所有p的的子串,返回这些子串的起始索引。不考虑答案输出的顺序。指由相同字母重排列形成的字符串(包括相同的字符串)。[0,6]起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。[0,1,2]起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。原创 2024-09-06 15:38:33 · 255 阅读 · 0 评论 -
每日一练:和为K的子数组
给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列。22二、解法1-暴力破解 O(N^2)会超时枚举所有情况。原创 2024-09-06 17:18:53 · 184 阅读 · 0 评论 -
每日一练:移动零
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。nums =nums =[0][0]你能尽量减少完成的操作次数吗?原创 2024-09-04 11:06:43 · 189 阅读 · 0 评论 -
每日一练:最长连续序列
用 set 保存 nums 中的所有元素,因为 set 是有序的,还能自动去重。然后遍历 set 进行长度计算。优化:遍历 set 时,这个元素之前没有比它小1的元素说明这个元素是连续序列的开始,否则不用计算长度。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最长数字连续序列是 [1, 2, 3, 4]。请你设计并实现num时间复杂度为。给定一个未排序的整数数组。原创 2024-09-03 18:35:59 · 222 阅读 · 0 评论 -
每日一练:两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。[0,1]因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。[1,2][0,1]你可以想出一个时间复杂度小于O(n2)的算法吗?原创 2024-09-02 22:09:03 · 218 阅读 · 0 评论 -
每日一练:三数之和
给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。原创 2024-09-04 15:53:29 · 355 阅读 · 0 评论 -
每日一练:接雨水
给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。6上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。9。原创 2024-09-04 20:45:46 · 729 阅读 · 0 评论 -
每日一练:盛水最多的容器
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。你不能倾斜容器。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1。原创 2024-09-04 11:36:26 · 255 阅读 · 0 评论 -
每日一练:字母异位词分组
给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。是由重新排列源单词的所有字母得到的一个新单词。原创 2024-09-03 13:03:38 · 190 阅读 · 0 评论