2024年10月刷题记录
2024年10月1日
【leetcode】287. 寻找重复数
题意:
给定一个包含
n + 1
个整数的数组nums
,其数字都在[1, n]
范围内(包括1
和n
),可知至少存在一个重复的整数。假设
nums
只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组
nums
且只用常量级O(1)
的额外空间。
2024年10月2日
【leetcode】763. 划分字母区间
题意:
给你一个字符串
s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是
s
。返回一个表示每个字符串片段的长度的列表。
【leetcode】152. 乘积最大子数组
题意:
给你一个字符串
s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是
s
。返回一个表示每个字符串片段的长度的列表。
2024年10月3日
【leetcode】416. 分割等和子集
题意:
给你一个 只包含正整数 的 非空 数组
nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
【leetcode】32. 最长有效括号
题意:
给你一个只包含
'('
和')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
2024年10月4日
【leetcode】295. 数据流的中位数
题意:
中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
- 例如
arr = [2,3,4]
的中位数是3
。- 例如
arr = [2,3]
的中位数是(2 + 3) / 2 = 2.5
。实现 MedianFinder 类:
MedianFinder()
初始化MedianFinder
对象。void addNum(int num)
将数据流中的整数num
添加到数据结构中。double findMedian()
返回到目前为止所有元素的中位数。与实际答案相差10-5
以内的答案将被接受。
2024年10月6日
【leetcode】134. 加油站
题意:
在一条环路上有
n
个加油站,其中第i
个加油站有汽油gas[i]
升。你有一辆油箱容量无限的的汽车,从第
i
个加油站开往第i+1
个加油站需要消耗汽油cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组
gas
和cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回-1
。如果存在解,则 保证 它是 唯一 的。
2024年10月7日
【leetcode】871. 最低加油次数
题意:
汽车从起点出发驶向目的地,该目的地位于出发位置东面
target
英里处。沿途有加油站,用数组
stations
表示。其中stations[i] = [position_i, fuel_i]
表示第i
个加油站位于出发位置东面position_i
英里处,并且有fuel_i
升汽油。假设汽车油箱的容量是无限的,其中最初有
startFuel
升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回
-1
。注意:如果汽车到达加油站时剩余燃料为
0
,它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为0
,仍然认为它已经到达目的地。
2024年10月8日
【leetcode】1436. 旅行终点站
题意:
给你一份旅游线路图,该线路图中的旅行线路用数组
paths
表示,其中paths[i] = [cityAi, cityBi]
表示该线路将会从cityAi
直接前往cityBi
。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。题目数据保证线路图会形成一条不存在循环的线路,因此恰有一个旅行终点站。
2024年10月10日
【leetcode】3162. 优质数对的总数 I
题意:
给你两个整数数组
nums1
和nums2
,长度分别为n
和m
。同时给你一个正整数k
。如果
nums1[i]
可以被nums2[j] * k
整除,则称数对(i, j)
为 优质数对(0 <= i <= n - 1
,0 <= j <= m - 1
)。返回 优质数对 的总数。
2024年10月11日
【leetcode】3164. 优质数对的总数 II
题意:
给你两个整数数组
nums1
和nums2
,长度分别为n
和m
。同时给你一个正整数k
。如果
nums1[i]
可以被nums2[j] * k
整除,则称数对(i, j)
为 优质数对(0 <= i <= n - 1
,0 <= j <= m - 1
)。返回 优质数对 的总数。
2024年10月12日
【leetcode】3158. 求出出现两次数字的 XOR 值
题意:
给你一个数组
nums
,数组中的数字 要么 出现一次,要么 出现两次。请你返回数组中所有出现两次数字的按位
XOR
值,如果没有数字出现过两次,返回 0 。
2024年10月13日
【leetcode】1884. 鸡蛋掉落-两枚鸡蛋
题意:
给你 2 枚相同 的鸡蛋,和一栋从第
1
层到第n
层共有n
层楼的建筑。已知存在楼层
f
,满足0 <= f <= n
,任何从 高于f
的楼层落下的鸡蛋都 会碎 ,从f
楼层或比它低 的楼层落下的鸡蛋都 不会碎 。每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层
x
扔下(满足1 <= x <= n
)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计算并返回要确定
f
确切的值 的 最小操作次数 是多少?
2024年10月14日
【leetcode】234. 回文链表
题意:
给你一个单链表的头节点
head
,请你判断该链表是否为回文链表。如果是,返回true
;否则,返回false
。
【leetcode】138. 随机链表的复制
题意:
给你一个长度为
n
的链表,每个节点包含一个额外增加的随机指针random
,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。 深拷贝应该正好由
n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next
指针和random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有
X
和Y
两个节点,其中X.random --> Y
。那么在复制链表中对应的两个节点x
和y
,同样有x.random --> y
。返回复制链表的头节点。
用一个由
n
个节点组成的链表来表示输入/输出中的链表。每个节点用一个[val, random_index]
表示:
val
:一个表示Node.val
的整数。random_index
:随机指针指向的节点索引(范围从0
到n-1
);如果不指向任何节点,则为null
。你的代码 只 接受原链表的头节点
head
作为传入参数。
【leetcode】25. K 个一组翻转链表
题意:
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
2024年10月15日
【leetcode】92. 反转链表 II
题意:
给你单链表的头指针
head
和两个整数left
和right
,其中left <= right
。请你反转从位置left
到位置right
的链表节点,返回 反转后的链表 。
【leetcode】61. 旋转链表
题意:
给你一个链表的头节点
head
,旋转链表,将链表每个节点向右移动k
个位置。
【leetcode】86. 分隔链表
题意:
给你一个链表的头节点
head
和一个特定值x
,请你对链表进行分隔,使得所有 小于x
的节点都出现在 大于或等于x
的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
【leetcode】3200. 三角形的最大高度
题意:
给你两个整数
red
和blue
,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行有 1 个球,第 2 行有 2 个球,第 3 行有 3 个球,依此类推。每一行的球必须是 相同 颜色,且相邻行的颜色必须 不同。
返回可以实现的三角形的 最大 高度。
2024年10月16日
【leetcode】3194. 最小元素和最大元素的最小平均值
题意:
你有一个初始为空的浮点数数组
averages
。另给你一个包含n
个整数的数组nums
,其中n
为偶数。你需要重复以下步骤
n / 2
次:
- 从
nums
中移除 最小 的元素minElement
和 最大 的元素maxElement
。- 将
(minElement + maxElement) / 2
加入到averages
中。返回
averages
中的 最小 元素。
2024年10月17日
【leetcode】74. 搜索二维矩阵
题意:
给你一个满足下述两条属性的
m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数
target
,如果target
在矩阵中,返回true
;否则,返回false
。
2024年10月18日
【leetcode】3191. 使二进制数组全部等于 1 的最少操作次数 I
题意:
给你一个二进制数组
nums
。你可以对数组执行以下操作 任意 次(也可以 0 次):
- 选择数组中 任意连续 3 个元素,并将它们 全部反转 。
反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。
请你返回将
nums
中所有元素变为 1 的 最少 操作次数。如果无法全部变成 1 ,返回 -1 。
2024年10月19日
【leetcode】3192. 使二进制数组全部等于 1 的最少操作次数 II
题意:
给你一个二进制数组
nums
。你可以对数组执行以下操作 任意 次(也可以 0 次):
- 选择数组中 任意 一个下标
i
,并将从下标i
开始一直到数组末尾 所有 元素 反转 。反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。
请你返回将
nums
中所有元素变为 1 的 最少 操作次数。
2024年10月20日
【leetcode】908. 最小差值 I
题意:
给你一个整数数组
nums
,和一个整数k
。在一个操作中,您可以选择
0 <= i < nums.length
的任何索引i
。将nums[i]
改为nums[i] + x
,其中x
是一个范围为[-k, k]
的任意整数。对于每个索引i
,最多 只能 应用 一次 此操作。
nums
的 分数 是nums
中最大和最小元素的差值。在对
nums
中的每个索引最多应用一次上述操作后,返回nums
的最低 分数 。
2024年10月21日
【leetcode】910. 最小差值 II
题意:
给你一个整数数组
nums
,和一个整数k
。对于每个下标
i
(0 <= i < nums.length
),将nums[i]
变成nums[i] + k
或nums[i] - k
。
nums
的 分数 是nums
中最大元素和最小元素的差值。在更改每个下标对应的值之后,返回
nums
的最小 分数 。
2024年10月22日
【leetcode】3184. 构成整天的下标对数目 I
题意:
给你一个整数数组
hours
,表示以 小时 为单位的时间,返回一个整数,表示满足i < j
且hours[i] + hours[j]
构成 整天 的下标对i
,j
的数目。整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
【leetcode】3185. 构成整天的下标对数目 II
题意:
给你一个整数数组
hours
,表示以 小时 为单位的时间,返回一个整数,表示满足i < j
且hours[i] + hours[j]
构成 整天 的下标对i
,j
的数目。整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
2024年10月23日
【leetcode】153. 寻找旋转排序数组中的最小值
题意:
已知一个长度为
n
的数组,预先按照升序排列,经由1
到n
次 旋转 后,得到输入数组。例如,原数组nums = [0,1,2,4,5,6,7]
在变化后可能得到:
- 若旋转
4
次,则可以得到[4,5,6,7,0,1,2]
- 若旋转
7
次,则可以得到[0,1,2,4,5,6,7]
注意,数组
[a[0], a[1], a[2], ..., a[n-1]]
旋转一次 的结果为数组[a[n-1], a[0], a[1], a[2], ..., a[n-2]]
。给你一个元素值 互不相同 的数组
nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。你必须设计一个时间复杂度为
O(log n)
的算法解决此问题。
【leetcode】33. 搜索旋转排序数组
题意:
整数数组
nums
按升序排列,数组中的值 互不相同 。在传递给函数之前,
nums
在预先未知的某个下标k
(0 <= k < nums.length
)上进行了 旋转,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标 从 0 开始 计数)。例如,[0,1,2,4,5,6,7]
在下标3
处经旋转后可能变为[4,5,6,7,0,1,2]
。给你 旋转后 的数组
nums
和一个整数target
,如果nums
中存在这个目标值target
,则返回它的下标,否则返回-1
。你必须设计一个时间复杂度为
O(log n)
的算法解决此问题。
【leetcode】4. 寻找两个正序数组的中位数
题意:
给定两个大小分别为
m
和n
的正序(从小到大)数组nums1
和nums2
。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为
O(log (m+n))
。
2024年10月24日
【leetcode】3175. 找到连续赢 K 场比赛的第一位玩家
题意:
有
n
位玩家在进行比赛,玩家编号依次为0
到n - 1
。给你一个长度为
n
的整数数组skills
和一个 正 整数k
,其中skills[i]
是第i
位玩家的技能等级。skills
中所有整数 互不相同 。所有玩家从编号
0
到n - 1
排成一列。比赛进行方式如下:
- 队列中最前面两名玩家进行一场比赛,技能等级 更高 的玩家胜出。
- 比赛后,获胜者保持在队列的开头,而失败者排到队列的末尾。
这个比赛的赢家是 第一位连续 赢下
k
场比赛的玩家。请你返回这个比赛的赢家编号。
2024年10月26日
【leetcode】46. 全排列
题意:
给定一个不含重复数字的数组
nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
2024年10月27日
【leetcode】78. 子集
题意:
给你一个整数数组
nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
2024年10月28日
【leetcode】17. 电话号码的字母组合
题意:
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
2024年10月29日
【leetcode】22. 括号生成
题意:
数字
n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
【leetcode】79. 单词搜索
题意:
给定一个
m x n
二维字符网格board
和一个字符串单词word
。如果word
存在于网格中,返回true
;否则,返回false
。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
【leetcode】131. 分割回文串
题意:
给你一个字符串
s
,请你将s
分割成一些子串,使每个子串都是 回文串 。返回s
所有可能的分割方案。
【leetcode】51. N 皇后
题意:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将
n
个皇后放置在n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数
n
,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中
'Q'
和'.'
分别代表了皇后和空位。
【leetcode】200. 岛屿数量
题意:
给你一个由
'1'
(陆地)和'0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
【leetcode】208. 实现 Trie (前缀树)
题意:
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
请你实现 Trie 类:
Trie()
初始化前缀树对象。void insert(String word)
向前缀树中插入字符串word
。boolean search(String word)
如果字符串word
在前缀树中,返回true
(即,在检索之前已经插入);否则,返回false
。boolean startsWith(String prefix)
如果之前已经插入的字符串word
的前缀之一为prefix
,返回true
;否则,返回false
。
2024年10月30日
【leetcode】226. 翻转二叉树
题意:
给你一棵二叉树的根节点
root
,翻转这棵二叉树,并返回其根节点。
2024年10月31日
【leetcode】101. 对称二叉树
题意:
给你一个二叉树的根节点
root
, 检查它是否轴对称。
【leetcode】108. 将有序数组转换为二叉搜索树
题意:
给你一个整数数组
nums
,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。
【leetcode】98. 验证二叉搜索树
题意:
给你一个二叉树的根节点
root
,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
【leetcode】199. 二叉树的右视图
题意:
给定一个二叉树的 根节点
root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
【leetcode】114. 二叉树展开为链表
题意:
给你二叉树的根结点
root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。- 展开后的单链表应该与二叉树先序遍历顺序相同。
【leetcode】112. 路径总和
题意:
给你二叉树的根节点
root
和一个表示目标和的整数targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum
。如果存在,返回true
;否则,返回false
。叶子节点 是指没有子节点的节点。
【leetcode】113. 路径总和 II
题意:
给你二叉树的根节点
root
和一个整数目标和targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。
【leetcode】437. 路径总和 III
题意:
给定一个二叉树的根节点
root
,和一个整数targetSum
,求该二叉树里节点值之和等于targetSum
的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
【leetcode】124. 二叉树中的最大路径和
题意:
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点
root
,返回其 最大路径和 。