2023年2月刷题记录
2023年2月1日
leetcode2325. 解密消息
链接地址:https://leetcode.cn/problems/decode-the-message/
题意:
给你字符串
key
和message
,分别表示一个加密密钥和一段加密消息。解密message
的步骤如下:
- 使用
key
中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。- 将替换表与普通英文字母表对齐,形成对照表。
- 按照对照表 替换
message
中的每个字母。- 空格
' '
保持不变。
- 例如,
key = "***hap***p***y*** ***bo***y"
(实际的加密密钥会包含字母表中每个字母 至少一次),据此,可以得到部分对照表('h' -> 'a'
、'a' -> 'b'
、'p' -> 'c'
、'y' -> 'd'
、'b' -> 'e'
、'o' -> 'f'
)。返回解密后的消息。
2023年2月2日
leetcode1129. 颜色交替的最短路径
链接地址:https://leetcode.cn/problems/shortest-path-with-alternating-colors/
题意:
在一个有向图中,节点分别标记为
0, 1, ..., n-1
。图中每条边为红色或者蓝色,且存在自环或平行边。
red_edges
中的每一个[i, j]
对表示从节点i
到节点j
的红色有向边。类似地,blue_edges
中的每一个[i, j]
对表示从节点i
到节点j
的蓝色有向边。返回长度为
n
的数组answer
,其中answer[X]
是从节点0
到节点X
的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么answer[x] = -1
。
2023年2月3日
leetcode1145. 二叉树着色游戏
链接地址:https://leetcode.cn/problems/binary-tree-coloring-game/
题意:
有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点
root
,树上总共有n
个节点,且n
为奇数,其中每个节点上的值从1
到n
各不相同。最开始时:
- 「一号」玩家从
[1, n]
中取一个值x
(1 <= x <= n
);- 「二号」玩家也从
[1, n]
中取一个值y
(1 <= y <= n
)且y != x
。「一号」玩家给值为
x
的节点染上红色,而「二号」玩家给值为y
的节点染上蓝色。之后两位玩家轮流进行操作,「一号」玩家先手。每一回合,玩家选择一个被他染过色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色(「一号」玩家染红色,「二号」玩家染蓝色)。
如果(且仅在此种情况下)当前玩家无法找到这样的节点来染色时,其回合就会被跳过。
若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个
y
值可以确保你赢得这场游戏,则返回true
;若无法获胜,就请返回false
。
2023年2月4日
leetcode1798. 你能构造出连续值的最大数目
链接地址:https://leetcode.cn/problems/maximum-number-of-consecutive-values-you-can-make/
题意:
给你一个长度为
n
的整数数组coins
,它代表你拥有的n
个硬币。第i
个硬币的值为coins[i]
。如果你从这些硬币中选出一部分硬币,它们的和为x
,那么称,你可以 构造 出x
。请返回从
0
开始(包括0
),你最多能 构造 出多少个连续整数。你可能有多个相同值的硬币。
2023年2月5日
leetcode1716. 计算力扣银行的钱
链接地址:https://leetcode.cn/problems/calculate-money-in-leetcode-bank/
题意:
Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。
最开始,他在周一的时候存入
1
块钱。从周二到周日,他每天都比前一天多存入1
块钱。在接下来每一个周一,他都会比 前一个周一 多存入1
块钱。给你
n
,请你返回在第n
天结束的时候他在力扣银行总共存了多少块钱。
2023年2月6日
leetcode2331. 计算布尔二叉树的值
链接地址:https://leetcode.cn/problems/evaluate-boolean-binary-tree/
题意:
给你一棵 完整二叉树 的根,这棵树有以下特征:
- 叶子节点 要么值为
0
要么值为1
,其中0
表示False
,1
表示True
。- 非叶子节点 要么值为
2
要么值为3
,其中2
表示逻辑或OR
,3
表示逻辑与AND
。计算 一个节点的值方式如下:
- 如果节点是个叶子节点,那么节点的 值 为它本身,即
True
或者False
。- 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点
root
的布尔运算值。完整二叉树 是每个节点有
0
个或者2
个孩子的二叉树。叶子节点 是没有孩子的节点。
2023年2月7日
leetcode1604. 警告一小时内使用相同员工卡大于等于三次的人
链接地址:https://leetcode.cn/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/
题意:
力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个 警告 。
给你字符串数组
keyName
和keyTime
,其中[keyName[i], keyTime[i]]
对应一个人的名字和他在 某一天 内使用员工卡的时间。使用时间的格式是 24小时制 ,形如 "HH:MM" ,比方说
"23:51"
和"09:49"
。请你返回去重后的收到系统警告的员工名字,将它们按 字典序****升序 排序后返回。
请注意
"10:00"
-"11:00"
视为一个小时时间范围内,而"23:51"
-"00:10"
不被视为一小时内,因为系统记录的是某一天内的使用情况。
2023年2月8日
leetcode1233. 删除子文件夹
链接地址:https://leetcode.cn/problems/remove-sub-folders-from-the-filesystem/
题意:
你是一位系统管理员,手里有一份文件夹列表
folder
,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。如果文件夹
folder[i]
位于另一个文件夹folder[j]
下,那么folder[i]
就是folder[j]
的 子文件夹 。文件夹的「路径」是由一个或多个按以下格式串联形成的字符串:'/' 后跟一个或者多个小写英文字母。
- 例如,
"/leetcode"
和"/leetcode/problems"
都是有效的路径,而空字符串和"/"
不是。
2023年2月9日
leetcode1797. 设计一个验证系统
链接地址:https://leetcode.cn/problems/design-authentication-manager/
题意:
你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在
currentTime
时刻之后timeToLive
秒过期。如果验证码被更新了,那么它会在currentTime
(可能与之前的currentTime
不同)时刻延长timeToLive
秒。请你实现
AuthenticationManager
类:
AuthenticationManager(int timeToLive)
构造AuthenticationManager
并设置timeToLive
参数。generate(string tokenId, int currentTime)
给定tokenId
,在当前时间currentTime
生成一个新的验证码。renew(string tokenId, int currentTime)
将给定tokenId
且 未过期 的验证码在currentTime
时刻更新。如果给定tokenId
对应的验证码不存在或已过期,请你忽略该操作,不会有任何更新操作发生。countUnexpiredTokens(int currentTime)
请返回在给定currentTime
时刻,未过期 的验证码数目。如果一个验证码在时刻
t
过期,且另一个操作恰好在时刻t
发生(renew
或者countUnexpiredTokens
操作),过期事件 优先于 其他操作。
2023年2月10日
leetcode539. 最小时间差
链接地址:https://leetcode.cn/problems/minimum-time-difference/
题意:
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
2023年2月11日
leetcode2335. 装满杯子需要的最短总时长
链接地址:https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/
题意:
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满
2
杯 不同 类型的水或者1
杯任意类型的水。给你一个下标从 0 开始、长度为
3
的整数数组amount
,其中amount[0]
、amount[1]
和amount[2]
分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
2023年2月12日
leetcode1138. 字母板上的路径
链接地址:https://leetcode.cn/problems/alphabet-board-path/
题意:
我们从一块字母板上的位置
(0, 0)
出发,该坐标对应的字符为board[0][0]
。在本题里,字母板为
board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]
,如下所示。我们可以按下面的指令规则行动:
- 如果方格存在,
'U'
意味着将我们的位置上移一行;- 如果方格存在,
'D'
意味着将我们的位置下移一行;- 如果方格存在,
'L'
意味着将我们的位置左移一列;- 如果方格存在,
'R'
意味着将我们的位置右移一列;'!'
会把在我们当前位置(r, c)
的字符board[r][c]
添加到答案中。(注意,字母板上只存在有字母的位置。)
返回指令序列,用最小的行动次数让答案和目标
target
相同。你可以返回任何达成目标的路径。
2023年2月13日
leetcode1234. 替换子串得到平衡字符串
链接地址:https://leetcode.cn/problems/replace-the-substring-for-balanced-string/
题意:
有一个只含有
'Q', 'W', 'E', 'R'
四种字符,且长度为n
的字符串。假如在该字符串中,这四个字符都恰好出现
n/4
次,那么它就是一个「平衡字符串」。给你一个这样的字符串
s
,请通过「替换一个子串」的方式,使原字符串s
变成一个「平衡字符串」。你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。
请返回待替换子串的最小可能长度。
如果原字符串自身就是一个平衡字符串,则返回
0
。
2023年2月14日
leetcode1124. 表现良好的最长时间段
链接地址:https://leetcode.cn/problems/longest-well-performing-interval/
题意:
给你一份工作时间表
hours
,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于
8
小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
2023年2月15日
leetcode1250. 检查「好数组」
链接地址:https://leetcode.cn/problems/check-if-it-is-a-good-array/
题意:
给你一个正整数数组
nums
,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。假如该和结果为
1
,那么原数组就是一个「好数组」,则返回True
;否则请返回False
。
2023年2月16日
leetcode2341. 数组能形成多少数对
链接地址:https://leetcode.cn/problems/maximum-number-of-pairs-in-array/
题意:
给你一个下标从 0 开始的整数数组
nums
。在一步操作中,你可以执行以下步骤:
- 从
nums
选出 两个 相等的 整数- 从
nums
中移除这两个整数,形成一个 数对请你在
nums
上多次执行此操作直到无法继续执行。返回一个下标从 0 开始、长度为
2
的整数数组answer
作为答案,其中answer[0]
是形成的数对数目,answer[1]
是对nums
尽可能执行上述操作后剩下的整数数目。
2023年2月17日
leetcode1139. 最大的以 1 为边界的正方形
链接地址:https://leetcode.cn/problems/largest-1-bordered-square/
题意:
给你一个由若干
0
和1
组成的二维网格grid
,请你找出边界全部由1
组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回0
。
2023年2月18日
leetcode1237. 找出给定方程的正整数解
链接地址:https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/
题意:
给你一个函数
f(x, y)
和一个目标结果z
,函数公式未知,请你计算方程f(x,y) == z
所有可能的正整数 数对x
和y
。满足条件的结果数对可以按任意顺序返回。尽管函数的具体式子未知,但它是单调递增函数,也就是说:
f(x, y) < f(x + 1, y)
f(x, y) < f(x, y + 1)
函数接口定义如下:
interface CustomFunction { public: // Returns some positive integer f(x, y) for two positive integers x and y based on a formula. int f(int x, int y); };
你的解决方案将按如下规则进行评判:
- 判题程序有一个由
CustomFunction
的9
种实现组成的列表,以及一种为特定的z
生成所有有效数对的答案的方法。- 判题程序接受两个输入:
function_id
(决定使用哪种实现测试你的代码)以及目标结果z
。- 判题程序将会调用你实现的
findSolution
并将你的结果与答案进行比较。- 如果你的结果与答案相符,那么解决方案将被视作正确答案,即
Accepted
。
2023年2月19日
leetcode1792. 最大平均通过率
链接地址:https://leetcode.cn/problems/maximum-average-pass-ratio/
题意:
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组
classes
,其中classes[i] = [passi, totali]
,表示你提前知道了第i
个班级总共有totali
个学生,其中只有passi
个学生可以通过考试。给你一个整数
extraStudents
,表示额外有extraStudents
个聪明的学生,他们 一定 能通过任何班级的期末考。你需要给这extraStudents
个学生每人都安排一个班级,使得 所有 班级的 平均 通过率 最大 。一个班级的 通过率 等于这个班级通过考试的学生人数除以这个班级的总人数。平均通过率 是所有班级的通过率之和除以班级数目。
请你返回在安排这
extraStudents
个学生去对应班级后的 最大 平均通过率。与标准答案误差范围在10-5
以内的结果都会视为正确结果。
2023年2月20日
leetcode2347. 最好的扑克手牌
链接地址:https://leetcode.cn/problems/best-poker-hand/
题意:
给你一个整数数组
ranks
和一个字符数组suit
。你有5
张扑克牌,第i
张牌大小为ranks[i]
,花色为suits[i]
。下述是从好到坏你可能持有的 手牌类型 :
"Flush"
:同花,五张相同花色的扑克牌。"Three of a Kind"
:三条,有 3 张大小相同的扑克牌。"Pair"
:对子,两张大小一样的扑克牌。"High Card"
:高牌,五张大小互不相同的扑克牌。请你返回一个字符串,表示给定的 5 张牌中,你能组成的 最好手牌类型 。
注意:返回的字符串 大小写 需与题目描述相同。
2023年2月21日(今日四题)
关键词:区间贪心
leetcode1326. 灌溉花园的最少水龙头数目
链接地址:https://leetcode.cn/problems/minimum-number-of-taps-to-open-to-water-a-garden/
题意:
在 x 轴上有一个一维的花园。花园长度为
n
,从点0
开始,到点n
结束。花园里总共有
n + 1
个水龙头,分别位于[0, 1, ..., n]
。给你一个整数
n
和一个长度为n + 1
的整数数组ranges
,其中ranges[i]
(下标从 0 开始)表示:如果打开点i
处的水龙头,可以灌溉的区域为[i - ranges[i], i + ranges[i]]
。请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 -1 。
leetcode55. 跳跃游戏
链接地址:https://leetcode.cn/problems/jump-game/
题意:
给定一个非负整数数组
nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
leetcode45. 跳跃游戏 II
链接地址:https://leetcode.cn/problems/jump-game-ii/
题意:
给定一个长度为
n
的 0 索引整数数组nums
。初始位置为nums[0]
。每个元素
nums[i]
表示从索引i
向前跳转的最大长度。换句话说,如果你在nums[i]
处,你可以跳转到任意nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达
nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达nums[n - 1]
。
leetcode1024. 视频拼接
链接地址:https://leetcode.cn/problems/video-stitching/
题意:
你将会获得一系列视频片段,这些片段来自于一项持续时长为
time
秒的体育赛事。这些片段可能有所重叠,也可能长度不一。使用数组
clips
描述所有的视频片段,其中clips[i] = [starti, endi]
表示:某个视频片段开始于starti
并于endi
结束。甚至可以对这些片段自由地再剪辑:
- 例如,片段
[0, 7]
可以剪切成[0, 1] + [1, 3] + [3, 7]
三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段(
[0, time]
)。返回所需片段的最小数目,如果无法完成该任务,则返回-1
。
2023年2月22日
leetcode66. 加一
链接地址:https://leetcode.cn/problems/plus-one/
题意:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
2023年2月23日
leetcode1238. 循环码排列
链接地址:https://leetcode.cn/problems/circular-permutation-in-binary-representation/
题意:
给你两个整数
n
和start
。你的任务是返回任意(0,1,2,,...,2^n-1)
的排列p
,并且满足:
p[0] = start
p[i]
和p[i+1]
的二进制表示形式只有一位不同p[0]
和p[2^n -1]
的二进制表示形式也只有一位不同
2023年2月24日
leetcode2357. 使数组中所有元素都等于零
链接地址:https://leetcode.cn/problems/make-array-zero-by-subtracting-equal-amounts/
题意:
给你一个非负整数数组
nums
。在一步操作中,你必须:
- 选出一个正整数
x
,x
需要小于或等于nums
中 最小 的 非零 元素。nums
中的每个正整数都减去x
。返回使
nums
中所有元素都等于0
需要的 最少 操作数。
2023年2月25日
leetcode1247. 交换字符使得字符串相同
链接地址:https://leetcode.cn/problems/minimum-swaps-to-make-strings-equal/
题意:
有两个长度相同的字符串
s1
和s2
,且它们其中 只含有 字符"x"
和"y"
,你需要通过「交换字符」的方式使这两个字符串相同。每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。
交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换
s1[i]
和s2[j]
,但不能交换s1[i]
和s1[j]
。最后,请你返回使
s1
和s2
相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回-1
。
2023年2月26日
leetcode67. 二进制求和
链接地址:https://leetcode.cn/problems/add-binary/
题意:
给你两个二进制字符串
a
和b
,以二进制字符串的形式返回它们的和。
2023年2月27日
leetcode2239. 找到最接近 0 的数字
链接地址:https://leetcode.cn/problems/find-closest-number-to-zero/
题意:
给你一个长度为
n
的整数数组nums
,请你返回nums
中最 接近0
的数字。如果有多个答案,请你返回它们中的 最大值 。
2023年2月28日
leetcode2363. 合并相似的物品
链接地址:https://leetcode.cn/problems/merge-similar-items/
题意:
给你两个二维整数数组
items1
和items2
,表示两个物品集合。每个数组items
有以下特质:
items[i] = [valuei, weighti]
其中valuei
表示第i
件物品的 价值 ,weighti
表示第i
件物品的 重量 。items
中每件物品的价值都是 唯一的 。请你返回一个二维数组
ret
,其中ret[i] = [valuei, weighti]
,weighti
是所有价值为valuei
物品的 重量之和 。注意:
ret
应该按价值 升序 排序后返回。