2024年9月刷题记录
2024年9月1日
【leetcode】1450. 在既定时间做作业的学生人数
题意:
给你两个整数数组
startTime
(开始时间)和endTime
(结束时间),并指定一个整数queryTime
作为查询时间。已知,第
i
名学生在startTime[i]
时开始写作业并于endTime[i]
时完成作业。请返回在查询时间
queryTime
时正在做作业的学生人数。形式上,返回能够使queryTime
处于区间[startTime[i], endTime[i]]
(含)的学生人数。
2024年9月2日
【leetcode】2024. 考试的最大困扰度
题意:
一位老师正在出一场由
n
道判断题构成的考试,每道题的答案为 true (用'T'
表示)或者 false (用'F'
表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。给你一个字符串
answerKey
,其中answerKey[i]
是第i
个问题的正确结果。除此以外,还给你一个整数k
,表示你能进行以下操作的最多次数:
- 每次操作中,将问题的正确答案改为
'T'
或者'F'
(也就是将answerKey[i]
改为'T'
或者'F'
)。请你返回在不超过
k
次操作的情况下,最大 连续'T'
或者'F'
的数目。
【leetcode】424. 替换后的最长重复字符
给你一个字符串
s
(仅由大写英文字母组成)和一个整数k
。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行k
次。在执行上述操作后,返回包含相同字母的最长子字符串的长度。
【leetcode】2401. 最长优雅子数组
给你一个由 正 整数组成的数组
nums
。如果
nums
的子数组中位于 不同 位置的每对元素按位 与(AND)运算的结果等于0
,则称该子数组为 优雅 子数组。返回 最长 的优雅子数组的长度。
子数组 是数组中的一个 连续 部分。
注意:长度为
1
的子数组始终视作优雅子数组。
【leetcode】2009. 使数组连续的最少操作数
给你一个整数数组
nums
。每一次操作中,你可以将nums
中 任意 一个元素替换成 任意 整数。如果
nums
满足以下条件,那么它是 连续的 :
nums
中所有元素都是 互不相同 的。nums
中 最大 元素与 最小 元素的差等于nums.length - 1
。比方说,
nums = [4, 2, 5, 3]
是 连续的 ,但是nums = [1, 2, 3, 5, 6]
不是连续的 。请你返回使
nums
连续 的 最少 操作次数。
2024年9月3日
【leetcode】2708. 一个小组的最大实力值
给你一个下标从 0 开始的整数数组
nums
,它表示一个班级中所有学生在一次考试中的成绩。老师想选出一部分同学组成一个 非空 小组,且这个小组的 实力值 最大,如果这个小组里的学生下标为i_0
,i_1
,i_2
, ... ,i_k
,那么这个小组的实力值定义为nums[i_0] * nums[i_1] * nums[i_2] * ... * nums[i_k]
。请你返回老师创建的小组能得到的最大实力值为多少。
2024年9月4日
【leetcode】2860. 让所有学生保持开心的分组方法数
给你一个下标从 0 开始、长度为
n
的整数数组nums
,其中n
是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生:如果能够满足下述两个条件之一,则认为第
i
位学生将会保持开心:
- 这位学生被选中,并且被选中的学生人数 严格大于
nums[i]
。- 这位学生没有被选中,并且被选中的学生人数 严格小于
nums[i]
。返回能够满足让所有学生保持开心的分组方法的数目。
2024年9月5日
【leetcode】3174. 清除数字
给你一个字符串
s
。你的任务是重复以下操作删除 所有 数字字符:
- 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。
请你返回删除所有数字字符以后剩下的字符串。
2024年9月6日
【leetcode】191. 位1的个数
编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。
2024年9月7日
【leetcode】209. 长度最小的子数组
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
2024年9月8日
【leetcode】977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。请你设计时间复杂度为
O(n)
的算法解决本问题。
2024年9月9日
【leetcode】2181. 合并零之间的节点
给你一个链表的头节点
head
,该链表包含由0
分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足Node.val == 0
。对于每两个相邻的
0
,请你将它们之间的所有节点合并成一个节点,其值是所有已合并节点的值之和。然后将所有0
移除,修改后的链表不应该含有任何0
。返回修改后链表的头节点
head
。
2024年9月10日
【leetcode】456. 132 模式
给你一个整数数组
nums
,数组中共有n
个整数。132 模式的子序列 由三个整数nums[i]
、nums[j]
和nums[k]
组成,并同时满足:i < j < k
和nums[i] < nums[k] < nums[j]
。如果
nums
中存在 132 模式的子序列 ,返回true
;否则,返回false
。
【leetcode】42. 接雨水
给定
n
个非负整数表示每个宽度为1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2024年9月11日
【leetcode】2555. 两个线段获得的最多奖品
在 X轴 上有一些奖品。给你一个整数数组
prizePositions
,它按照 非递减 顺序排列,其中prizePositions[i]
是第i
件奖品的位置。数轴上一个位置可能会有多件奖品。再给你一个整数k
。你可以同时选择两个端点为整数的线段。每个线段的长度都必须是
k
。你可以获得位置在任一线段上的所有奖品(包括线段的两个端点)。注意,两个线段可能会有相交。
- 比方说
k = 2
,你可以选择线段[1, 3]
和[2, 4]
,你可以获得满足1 <= prizePositions[i] <= 3
或者2 <= prizePositions[i] <= 4
的所有奖品 i 。请你返回在选择两个最优线段的前提下,可以获得的 最多 奖品数目。
2024年9月12日
【leetcode】2576. 求出最多标记下标
给你一个下标从 0 开始的整数数组
nums
。一开始,所有下标都没有被标记。你可以执行以下操作任意次:
- 选择两个 互不相同且未标记 的下标
i
和j
,满足2 * nums[i] <= nums[j]
,标记下标i
和j
。请你执行上述操作任意次,返回
nums
中最多可以标记的下标数目。
2024年9月13日
【leetcode】698. 划分为k个相等的子集
给定一个整数数组
nums
和一个正整数k
,找出是否有可能把这个数组分成k
个非空子集,其总和都相等。
2024年9月14日
【leetcode】2390. 从字符串中移除星号
给你一个包含若干星号
*
的字符串s
。在一步操作中,你可以:
- 选中
s
中的一个星号。- 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
返回移除 所有 星号之后的字符串。
注意:
- 生成的输入保证总是可以执行题面中描述的操作。
- 可以证明结果字符串是唯一的。
2024年9月15日
【leetcode】2848. 与车相交的点
给你一个下标从 0 开始的二维整数数组
nums
表示汽车停放在数轴上的坐标。对于任意下标i
,nums[i] = [starti, endi]
,其中starti
是第i
辆车的起点,endi
是第i
辆车的终点。返回数轴上被车 任意部分 覆盖的整数点的数目。
2024年9月16日
【leetcode】1184. 公交站间的距离
环形公交路线上有
n
个站,按次序从0
到n - 1
进行编号。我们已知每一对相邻公交站之间的距离,distance[i]
表示编号为i
的车站和编号为(i + 1) % n
的车站之间的距离。环线上的公交车都可以按顺时针和逆时针的方向行驶。
返回乘客从出发点
start
到目的地destination
之间的最短距离。
2024年9月17日
【leetcode】815. 公交路线
给你一个数组
routes
,表示一系列公交线路,其中每个routes[i]
表示一条公交线路,第i
辆公交车将会在上面循环行驶。
- 例如,路线
routes[0] = [1, 5, 7]
表示第0
辆公交车会一直按序列1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ...
这样的车站路线行驶。现在从
source
车站出发(初始时不在公交车上),要前往target
车站。 期间仅可乘坐公交车。求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回
-1
。
2024年9月18日
【leetcode】2332. 坐上公交的最晚时间
给你一个下标从 0 开始长度为
n
的整数数组buses
,其中buses[i]
表示第i
辆公交车的出发时间。同时给你一个下标从 0 开始长度为m
的整数数组passengers
,其中passengers[j]
表示第j
位乘客的到达时间。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。给你一个整数
capacity
,表示每辆公交车 最多 能容纳的乘客数目。每位乘客都会搭乘下一辆有座位的公交车。如果你在
y
时刻到达,公交在x
时刻出发,满足y <= x
且公交没有满,那么你可以搭乘这一辆公交。最早 到达的乘客优先上车。返回你可以搭乘公交车的最晚到达公交站时间。你 不能 跟别的乘客同时刻到达。
注意:数组
buses
和passengers
不一定是有序的。
2024年9月19日
【leetcode】2414. 最长的字母序连续子字符串的长度
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串
"abcdefghijklmnopqrstuvwxyz"
的任意子字符串都是 字母序连续字符串 。
- 例如,
"abc"
是一个字母序连续字符串,而"acb"
和"za"
不是。给你一个仅由小写英文字母组成的字符串
s
,返回其 最长 的 字母序连续子字符串 的长度。
2024年9月20日
【leetcode】2376. 统计特殊整数
如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。
给你一个 正 整数
n
,请你返回区间[1, n]
之间特殊整数的数目。
2024年9月21日
【leetcode】2374. 边积分最高的节点
给你一个有向图,图中有
n
个节点,节点编号从0
到n - 1
,其中每个节点都 恰有一条 出边。图由一个下标从 0 开始、长度为
n
的整数数组edges
表示,其中edges[i]
表示存在一条从节点i
到节点edges[i]
的 有向 边。节点
i
的 边积分 定义为:所有存在一条指向节点i
的边的节点的 编号 总和。返回 边积分 最高的节点。如果多个节点的 边积分 相同,返回编号 最小 的那个。
2024年9月22日
【leetcode】997. 找到小镇的法官
小镇里有
n
个人,按从1
到n
的顺序编号。传言称,这些人中有一个暗地里是小镇法官。如果小镇法官真的存在,那么:
- 小镇法官不会信任任何人。
- 每个人(除了小镇法官)都信任这位小镇法官。
- 只有一个人同时满足属性 1 和属性 2 。
给你一个数组
trust
,其中trust[i] = [a_i, b_i]
表示编号为a_i
的人信任编号为b_i
的人。如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回
-1
。
2024年9月23日
【leetcode】1014. 最佳观光组合
给你一个正整数数组
values
,其中values[i]
表示第i
个观光景点的评分,并且两个景点i
和j
之间的 距离 为j - i
。一对景点(
i < j
)组成的观光组合的得分为values[i] + values[j] + i - j
,也就是景点的评分之和 减去 它们两者之间的距离。返回一对观光景点能取得的最高分。
2024年9月24日
【leetcode】5. 最长回文子串
给你一个字符串
s
,找到s
中最长的回文子串。
【leetcode】516. 最长回文子序列
给你一个字符串
s
,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
【leetcode】2207. 字符串中最多数目的子序列
给你一个下标从 0 开始的字符串
text
和另一个下标从 0 开始且长度为2
的字符串pattern
,两者都只包含小写英文字母。你可以在
text
中任意位置插入 一个 字符,这个插入的字符必须是pattern[0]
或者pattern[1]
。注意,这个字符可以插入在text
开头或者结尾的位置。请你返回插入一个字符后,
text
中最多包含多少个等于pattern
的 子序列 。子序列 指的是将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。
【leetcode】1143. 最长公共子序列
给定两个字符串
text1
和text2
,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回0
。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
- 例如,
"ace"
是"abcde"
的子序列,但"aec"
不是"abcde"
的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
【leetcode】72. 编辑距离
给你两个单词
word1
和word2
, 请返回将word1
转换成word2
所使用的最少操作数。你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
2024年9月25日
【leetcode】279. 完全平方数
给你一个整数
n
,返回 和为n
的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,
1
、4
、9
和16
都是完全平方数,而3
和11
不是。
2024年9月26日
【leetcode】2535. 数组元素和与数字和的绝对差
给你一个正整数数组
nums
。
- 元素和 是
nums
中的所有元素相加求和。- 数字和 是
nums
中每一个元素的每一数位(重复数位需多次求和)相加求和。返回 元素和 与 数字和 的绝对差。
注意:两个整数
x
和y
的绝对差定义为|x - y|
。
2024年9月27日
【leetcode】76. 最小覆盖子串
给你一个字符串
s
、一个字符串t
。返回s
中涵盖t
所有字符的最小子串。如果s
中不存在涵盖t
所有字符的子串,则返回空字符串""
。注意:
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。- 如果
s
中存在这样的子串,我们保证它是唯一的答案。
【leetcode】41. 缺失的第一个正数
给你一个未排序的整数数组
nums
,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为
O(n)
并且只使用常数级别额外空间的解决方案。
【leetcode】2516. 每种字符至少取 K 个
给你一个由字符
'a'
、'b'
、'c'
组成的字符串s
和一个非负整数k
。每分钟,你可以选择取走s
最左侧 还是 最右侧 的那个字符。你必须取走每种字符 至少
k
个,返回需要的 最少 分钟数;如果无法取到,则返回-1
。
【leetcode】54. 螺旋矩阵
给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
【leetcode】48. 旋转图像
给定一个 n × n 的二维矩阵
matrix
表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
【leetcode】240. 搜索二维矩阵 II
编写一个高效的算法来搜索
m*n
矩阵matrix
中的一个目标值target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
2024年9月28日
【leetcode】62. 不同路径
一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
【leetcode】64. 最小路径和
给定一个包含非负整数的
m x n
网格grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
【leetcode】31. 下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
- 例如,
arr = [1,2,3]
,以下这些都可以视作arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如,
arr = [1,2,3]
的下一个排列是[1,3,2]
。- 类似地,
arr = [2,3,1]
的下一个排列是[3,1,2]
。- 而
arr = [3,2,1]
的下一个排列是[1,2,3]
,因为[3,2,1]
不存在一个字典序更大的排列。给你一个整数数组
nums
,找出nums
的下一个排列。必须原地修改,只允许使用额外常数空间。
2024年9月29日
【leetcode】155. 最小栈
设计一个支持
push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。实现
MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
【leetcode】394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:
k[encoded_string]
,表示其中方括号内部的encoded_string
正好重复k
次。注意k
保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数
k
,例如不会出现像3a
或2[4]
的输入。
2024年9月30日
【leetcode】84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
【leetcode】215. 数组中的第K个最大元素
给定整数数组
nums
和整数k
,请返回数组中第k
个最大的元素。请注意,你需要找的是数组排序后的第
k
个最大的元素,而不是第k
个不同的元素。你必须设计并实现时间复杂度为
O(n)
的算法解决此问题。
2024年9月31日
【leetcode】1845. 座位预约管理系统
请你设计一个管理
n
个座位预约的系统,座位编号从1
到n
。请你实现
SeatManager
类:
SeatManager(int n)
初始化一个SeatManager
对象,它管理从1
到n
编号的n
个座位。所有座位初始都是可预约的。int reserve()
返回可以预约座位的 最小编号 ,此座位变为不可预约。void unreserve(int seatNumber)
将给定编号seatNumber
对应的座位变成可以预约。
【leetcode】347. 前 K 个高频元素
给你一个整数数组
nums
和一个整数k
,请你返回其中出现频率前k
高的元素。你可以按 任意顺序 返回答案。