2024年5月刷题记录
2024年5月1日
【leetcode】2462. 雇佣 K 位工人的总代价
题意:
给你一个下标从 0 开始的整数数组
costs
,其中costs[i]
是雇佣第i
位工人的代价。同时给你两个整数
k
和candidates
。我们想根据以下规则恰好雇佣k
位工人:
- 总共进行
k
轮雇佣,且每一轮恰好雇佣一位工人。- 在每一轮雇佣中,从最前面 candidates 和最后面 candidates 人中选出代价最小的一位工人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。
- 比方说,
costs = [3,2,7,7,1,2]
且candidates = 2
,第一轮雇佣中,我们选择第4
位工人,因为他的代价最小[3,2,7,7,*1*,2]
。- 第二轮雇佣,我们选择第
1
位工人,因为他们的代价与第4
位工人一样都是最小代价,而且下标更小,[3,*2*,7,7,2]
。注意每一轮雇佣后,剩余工人的下标可能会发生变化。- 如果剩余员工数目不足
candidates
人,那么下一轮雇佣他们中代价最小的一人,如果有多位代价相同且最小的工人,选择下标更小的一位工人。- 一位工人只能被选择一次。
返回雇佣恰好
k
位工人的总代价。
2024年5月2日
【leetcode】2462. 雇佣 K 位工人的总代价
题意:
有
n
名工人。 给定两个数组quality
和wage
,其中,quality[i]
表示第i
名工人的工作质量,其最低期望工资为wage[i]
。现在我们想雇佣
k
名工人组成一个工资组。在雇佣 一组k
名工人时,我们必须按照下述规则向他们支付工资:
- 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
- 工资组中的每名工人至少应当得到他们的最低期望工资。
给定整数
k
,返回 组成满足上述条件的付费群体所需的最小金额 。在实际答案的10^-5
以内的答案将被接受。
2024年5月3日
【leetcode】1491. 去掉最低工资和最高工资后的工资平均值
题意:
给你一个整数数组
salary
,数组里每个数都是 唯一 的,其中salary[i]
是第i
个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
2024年5月4日
【leetcode】1235. 规划兼职工作
题意:
你打算利用空闲时间来做兼职工作赚些零花钱。
这里有
n
份兼职工作,每份工作预计从startTime[i]
开始到endTime[i]
结束,报酬为profit[i]
。给你一份兼职工作表,包含开始时间
startTime
,结束时间endTime
和预计报酬profit
三个数组,请你计算并返回可以获得的最大报酬。注意,时间上出现重叠的 2 份工作不能同时进行。
如果你选择的工作在时间
X
结束,那么你可以立刻进行在时间X
开始的下一份工作。
2024年5月5日
【leetcode】1652. 拆炸弹
题意:
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为
n
的 循环 数组code
以及一个密钥k
。为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。
- 如果
k > 0
,将第i
个数字用 接下来k
个数字之和替换。- 如果
k < 0
,将第i
个数字用 之前k
个数字之和替换。- 如果
k == 0
,将第i
个数字用0
替换。由于
code
是循环的,code[n-1]
下一个元素是code[0]
,且code[0]
前一个元素是code[n-1]
。给你 循环 数组
code
和整数密钥k
,请你返回解密后的结果来拆除炸弹!
2024年5月6日
【leetcode】238. 除自身以外数组的乘积
题意:
给你一个整数数组
nums
,返回 数组answer
,其中answer[i]
等于nums
中除nums[i]
之外其余各元素的乘积。题目数据 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在
O(n)
时间复杂度内完成此题。保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。进阶:你可以在
O(1)
的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)
2024年5月7日
【leetcode】100. 相同的树
题意:
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
2024年5月8日
【leetcode】2079. 给植物浇水
题意:
你打算用一个水罐给花园里的
n
株植物浇水。植物排成一行,从左到右进行标记,编号从0
到n - 1
。其中,第i
株植物的位置是x = i
。x = -1
处有一条河,你可以在那里重新灌满你的水罐。每一株植物都需要浇特定量的水。你将会按下面描述的方式完成浇水:
- 按从左到右的顺序给植物浇水。
- 在给当前植物浇完水之后,如果你没有足够的水 完全 浇灌下一株植物,那么你就需要返回河边重新装满水罐。
- 你 不能 提前重新灌满水罐。
最初,你在河边(也就是,
x = -1
),在 x 轴上每移动 一个单位 都需要 一步 。给你一个下标从 0 开始的整数数组
plants
,数组由n
个整数组成。其中,plants[i]
为第i
株植物需要的水量。另有一个整数capacity
表示水罐的容量,返回浇灌所有植物需要的 步数 。
2024年5月9日
【leetcode】2105. 给植物浇水 II
题意:
Alice 和 Bob 打算给花园里的
n
株植物浇水。植物排成一行,从左到右进行标记,编号从0
到n - 1
。其中,第i
株植物的位置是x = i
。每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐,最初是满的 。他们按下面描述的方式完成浇水:
- Alice 按 从左到右 的顺序给植物浇水,从植物
0
开始。Bob 按 从右到左 的顺序给植物浇水,从植物n - 1
开始。他们 同时 给植物浇水。- 无论需要多少水,为每株植物浇水所需的时间都是相同的。
- 如果 Alice/Bob 水罐中的水足以 完全 灌溉植物,他们 必须 给植物浇水。否则,他们 首先(立即)重新装满罐子,然后给植物浇水。
- 如果 Alice 和 Bob 到达同一株植物,那么当前水罐中水 更多 的人会给这株植物浇水。如果他俩水量相同,那么 Alice 会给这株植物浇水。
给你一个下标从 0 开始的整数数组
plants
,数组由n
个整数组成。其中,plants[i]
为第i
株植物需要的水量。另有两个整数capacityA
和capacityB
分别表示 Alice 和 Bob 水罐的容量。返回两人浇灌所有植物过程中重新灌满水罐的 次数 。
2024年5月10日
【leetcode】2960. 统计已测试设备
题意:
给你一个长度为
n
、下标从 0 开始的整数数组batteryPercentages
,表示n
个设备的电池百分比。你的任务是按照顺序测试每个设备
i
,执行以下测试操作:
- 如果
batteryPercentages[i]
大于 0 :
- 增加 已测试设备的计数。
- 将下标在
[i + 1, n - 1]
的所有设备的电池百分比减少1
,确保它们的电池百分比 不会低于0
,即batteryPercentages[j] = max(0, batteryPercentages[j] - 1)
。- 移动到下一个设备。
- 否则,移动到下一个设备而不执行任何测试。
返回一个整数,表示按顺序执行测试操作后 已测试设备 的数量。
2024年5月11日
【leetcode】2391. 收集垃圾的最少总时间
题意:
给你一个下标从 0 开始的字符串数组
garbage
,其中garbage[i]
表示第i
个房子的垃圾集合。garbage[i]
只包含字符'M'
,'P'
和'G'
,但可能包含多个相同字符,每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何一种垃圾都需要花费1
分钟。同时给你一个下标从 0 开始的整数数组
travel
,其中travel[i]
是垃圾车从房子i
行驶到房子i + 1
需要的分钟数。城市里总共有三辆垃圾车,分别收拾三种垃圾。每辆垃圾车都从房子
0
出发,按顺序 到达每一栋房子。但它们 不是必须 到达所有的房子。任何时刻只有 一辆 垃圾车处在使用状态。当一辆垃圾车在行驶或者收拾垃圾的时候,另外两辆车 不能 做任何事情。
请你返回收拾完所有垃圾需要花费的 最少 总分钟数。
2024年5月12日
【leetcode】1553. 吃掉 N 个橘子的最少天数
题意:
厨房里总共有
n
个橘子,你决定每一天选择如下方式之一吃这些橘子:
- 吃掉一个橘子。
- 如果剩余橘子数
n
能被 2 整除,那么你可以吃掉n/2
个橘子。- 如果剩余橘子数
n
能被 3 整除,那么你可以吃掉2*(n/3)
个橘子。每天你只能从以上 3 种方案中选择一种方案。
请你返回吃掉所有
n
个橘子的最少天数。
2024年5月13日
【leetcode】994. 腐烂的橘子
题意:
在给定的
m x n
网格grid
中,每个单元格可以有以下三个值之一:
- 值
0
代表空单元格;- 值
1
代表新鲜橘子;- 值
2
代表腐烂的橘子。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回
-1
。
2024年5月14日
【leetcode】2244. 完成所有任务需要的最少轮数
题意:
给你一个下标从 0 开始的整数数组
tasks
,其中tasks[i]
表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回
-1
。
2024年5月16日
【leetcode】1953. 你可以工作的最大周数
题意:
给你
n
个项目,编号从0
到n - 1
。同时给你一个整数数组milestones
,其中每个milestones[i]
表示第i
个项目中的阶段任务数量。你可以按下面两个规则参与项目中的工作:
- 每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。
- 在 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。
一旦所有项目中的全部阶段任务都完成,或者仅剩余一个阶段任务都会导致你违反上面的规则,那么你将 停止工作 。注意,由于这些条件的限制,你可能无法完成所有阶段任务。
返回在不违反上面规则的情况下你 最多 能工作多少周。
2024年5月17日
【leetcode】826. 安排工作以达到最大收益
题意:
你有
n
个工作和m
个工人。给定三个数组:difficulty
,profit
和worker
,其中:
difficulty[i]
表示第i
个工作的难度,profit[i]
表示第i
个工作的收益。worker[i]
是第i
个工人的能力,即该工人只能完成难度小于等于worker[i]
的工作。每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次 。
- 举个例子,如果 3 个工人都尝试完成一份报酬为
$1
的同样工作,那么总收益为$3
。如果一个工人不能完成任何工作,他的收益为$0
。返回 在把工人分配到工作岗位后,我们所能获得的最大利润 。
2024年5月18日
【leetcode】2644. 找出可整除性得分最大的整数
题意:
给你两个下标从 0 开始的整数数组
nums
和divisors
。
divisors[i]
的 可整除性得分 等于满足nums[j]
能被divisors[i]
整除的下标j
的数量。返回 可整除性得分 最大的整数
divisors[i]
。如果有多个整数具有最大得分,则返回数值最小的一个。
2024年5月19日
【leetcode】1535. 找出数组游戏的赢家
题意:
给你一个由 不同 整数组成的整数数组
arr
和一个整数k
。每回合游戏都在数组的前两个元素(即
arr[0]
和arr[1]
)之间进行。比较arr[0]
与arr[1]
的大小,较大的整数将会取得这一回合的胜利并保留在位置0
,较小的整数移至数组的末尾。当一个整数赢得k
个连续回合时,游戏结束,该整数就是比赛的 赢家 。返回赢得比赛的整数。
题目数据 保证 游戏存在赢家。
2024年5月20日
【leetcode】88. 合并两个有序数组
题意:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。
【leetcode】27. 移除元素
题意:
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。- 返回
k
。
【leetcode】26. 删除有序数组中的重复项
题意:
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
【leetcode】80. 删除有序数组中的重复项 II
题意:
给你一个有序数组
nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
2024年5月21日
【leetcode】2769. 找出最大的可达成数字
题意:
给你两个整数
num
和t
。如果整数
x
可以在执行下述操作不超过t
次的情况下变为与num
相等,则称其为 可达成数字 :
- 每次操作将
x
的值增加或减少1
,同时可以选择将num
的值增加或减少1
。返回所有可达成数字中的最大值。可以证明至少存在一个可达成数字。
2024年5月22日
【leetcode】2225. 找出输掉零场或一场比赛的玩家
题意:
给你一个整数数组
matches
其中matches[i] = [winner_i, loser_i]
表示在一场比赛中winner_i
击败了loser_i
。返回一个长度为 2 的列表
answer
:
answer[0]
是所有 没有 输掉任何比赛的玩家列表。answer[1]
是所有恰好输掉 一场 比赛的玩家列表。两个列表中的值都应该按 递增 顺序返回。
注意:
- 只考虑那些参与 至少一场 比赛的玩家。
- 生成的测试用例保证 不存在 两场比赛结果 相同 。
2024年5月23日
【leetcode】2831. 找出最长等值子数组
题意:
给你一个下标从 0 开始的整数数组
nums
和一个整数k
。如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。
从
nums
中删除最多k
个元素后,返回可能的最长等值子数组的长度。子数组 是数组中一个连续且可能为空的元素序列。
2024年5月24日
【leetcode】1673. 找出最具竞争力的子序列
题意:
给你一个整数数组
nums
和一个正整数k
,返回长度为k
且最具 竞争力 的nums
子序列。数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。
在子序列
a
和子序列b
第一个不相同的位置上,如果a
中的数字小于b
中对应的数字,那么我们称子序列a
比子序列b
(相同长度下)更具 竞争力 。 例如,[1,3,4]
比[1,3,5]
更具竞争力,在第一个不相同的位置,也就是最后一个位置上,4
小于5
。
2024年5月25日
【leetcode】2903. 找出满足差值条件的下标 I
题意:
给你一个下标从 0 开始、长度为
n
的整数数组nums
,以及整数indexDifference
和整数valueDifference
。你的任务是从范围
[0, n - 1]
内找出 2 个满足下述所有条件的下标i
和j
:
abs(i - j) >= indexDifference
且abs(nums[i] - nums[j]) >= valueDifference
返回整数数组
answer
。如果存在满足题目要求的两个下标,则answer = [i, j]
;否则,answer = [-1, -1]
。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。注意:
i
和j
可能 相等 。
2024年5月26日
【leetcode】1738. 找出第 K 大的异或坐标值
题意:
给你一个二维矩阵
matrix
和一个整数k
,矩阵大小为m x n
由非负整数组成。矩阵中坐标
(a, b)
的 值 可由对所有满足0 <= i <= a < m
且0 <= j <= b < n
的元素matrix[i][j]
(下标从 0 开始计数)执行异或运算得到。请你找出
matrix
的所有坐标中第k
大的值(k
的值从 1 开始计数)。
2024年5月27日
【leetcode】2028. 找出缺失的观测数据
题意:
现有一份
n + m
次投掷单个 六面 骰子的观测数据,骰子的每个面从1
到6
编号。观测数据中缺失了n
份,你手上只拿到剩余m
次投掷的数据。幸好你有之前计算过的这n + m
次投掷数据的 平均值 。给你一个长度为
m
的整数数组rolls
,其中rolls[i]
是第i
次观测的值。同时给你两个整数mean
和n
。返回一个长度为
n
的数组,包含所有缺失的观测数据,且满足这n + m
次投掷的 平均值 是mean
。如果存在多组符合要求的答案,只需要返回其中任意一组即可。如果不存在答案,返回一个空数组。
k
个数字的 平均值 为这些数字求和后再除以k
。注意
mean
是一个整数,所以n + m
次投掷的总和需要被n + m
整除。
2024年5月28日
【leetcode】2951. 找出峰值
题意:
给你一个下标从 0 开始的数组
mountain
。你的任务是找出数组mountain
中的所有 峰值。以数组形式返回给定数组中 峰值 的下标,顺序不限 。
注意:
- 峰值 是指一个严格大于其相邻元素的元素。
- 数组的第一个和最后一个元素 不 是峰值。
2024年5月29日
【leetcode】2981. 找出出现至少三次的最长特殊子字符串 I
题意:
给你一个仅由小写英文字母组成的字符串
s
。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串
"abc"
不是特殊字符串,而字符串"ddd"
、"zz"
和"f"
是特殊字符串。返回在
s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回-1
。子字符串 是字符串中的一个连续 非空 字符序列。
2024年5月30日
【leetcode】2982. 找出出现至少三次的最长特殊子字符串 II
题意:
给你一个仅由小写英文字母组成的字符串
s
。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串
"abc"
不是特殊字符串,而字符串"ddd"
、"zz"
和"f"
是特殊字符串。返回在
s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回-1
。子字符串 是字符串中的一个连续 非空 字符序列。
2024年5月31日
【leetcode】2965. 找出缺失和重复的数字
题意:
给你一个下标从 0 开始的二维整数矩阵
grid
,大小为n * n
,其中的值在[1, n2]
范围内。除了a
出现 两次,b
缺失 之外,每个整数都 恰好出现一次 。任务是找出重复的数字
a
和缺失的数字b
。返回一个下标从 0 开始、长度为
2
的整数数组ans
,其中ans[0]
等于a
,ans[1]
等于b
。