2024年3月刷题记录
2024年3月1日
【leetcode】2369. 检查数组是否存在有效划分
题意:
给你一个下标从 0 开始的整数数组
nums
,你必须将数组划分为一个或多个 连续 子数组。如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:
- 子数组 恰 由
2
个相等元素组成,例如,子数组[2,2]
。- 子数组 恰 由
3
个相等元素组成,例如,子数组[4,4,4]
。- 子数组 恰 由
3
个连续递增元素组成,并且相邻元素之间的差值为1
。例如,子数组[3,4,5]
,但是子数组[1,3,5]
不符合要求。如果数组 至少 存在一种有效划分,返回
true
,否则,返回false
。
2024年3月2日
【leetcode】2368. 受限条件下可到达节点的数目
题意:
现有一棵由
n
个节点组成的无向树,节点编号从0
到n - 1
,共有n - 1
条边。给你一个二维整数数组
edges
,长度为n - 1
,其中edges[i] = [ai, bi]
表示树中节点ai
和bi
之间存在一条边。另给你一个整数数组restricted
表示 受限 节点。在不访问受限节点的前提下,返回你可以从节点
0
到达的 最多 节点数目。注意,节点
0
不 会标记为受限节点。
2024年3月3日
【leetcode】225. 用队列实现栈
题意:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(
push
、top
、pop
和empty
)。实现
MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。注意:
- 你只能使用队列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。- 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
2024年3月4日
【leetcode】232. 用栈实现队列
题意:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(
push
、pop
、peek
、empty
):实现
MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
2024年3月5日
【leetcode】1976. 到达目的地的方案数
题意:
你在一个城市里,城市由
n
个路口组成,路口编号为0
到n - 1
,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。给你一个整数
n
和二维整数数组roads
,其中roads[i] = [ui, vi, timei]
表示在路口ui
和vi
之间有一条需要花费timei
时间才能通过的道路。你想知道花费 最少时间 从路口0
出发到达路口n - 1
的方案数。请返回花费 最少时间 到达目的地的 路径数目 。由于答案可能很大,将结果对
10^9 + 7
取余 后返回。
2024年3月6日
【leetcode】2917. 找出数组中的 K-or 值
题意:
给你一个下标从 0 开始的整数数组
nums
和一个整数k
。
nums
中的 K-or 是一个满足以下条件的非负整数:
- 只有在
nums
中,至少存在k
个元素的第i
位值为 1 ,那么 K-or 中的第i
位的值才是 1 。返回
nums
的 K-or 值。注意 :对于整数
x
,如果(2^i AND x) == 2^i
,则x
中的第i
位值为 1 ,其中AND
为按位与运算符。
2024年3月7日
【leetcode】2575. 找出字符串的可整除数组
题意:
给你一个下标从 0 开始的字符串
word
,长度为n
,由从0
到9
的数字组成。另给你一个正整数m
。
word
的 可整除数组div
是一个长度为n
的整数数组,并满足:
- 如果
word[0,...,i]
所表示的 数值 能被m
整除,div[i] = 1
- 否则,
div[i] = 0
返回
word
的可整除数组。
2024年3月8日
【leetcode】2834. 找出美丽数组的最小和
题意:
给你两个正整数:
n
和target
。如果数组
nums
满足下述条件,则称其为 美丽数组 。
nums.length == n
.nums
由两两互不相同的正整数组成。- 在范围
[0, n-1]
内,不存在 两个 不同 下标i
和j
,使得nums[i] + nums[j] == target
。返回符合条件的美丽数组所可能具备的 最小 和,并对结果进行取模
10^9 + 7
。
2024年3月10日
【leetcode】299. 猜数字游戏
题意:
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
- 猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls",公牛),
- 有多少位属于数字猜对了但是位置不对(称为 "Cows",奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
给你一个秘密数字
secret
和朋友猜测的数字guess
,请你返回对朋友这次猜测的提示。提示的格式为
"xAyB"
,x
是公牛个数,y
是奶牛个数,A
表示公牛,B
表示奶牛。请注意秘密数字和朋友猜测的数字都可能含有重复数字。
2024年3月11日
【leetcode】2129. 将标题首字母大写
题意:
给你一个字符串
title
,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 :
- 如果单词的长度为
1
或者2
,所有字母变成小写。- 否则,将单词首字母大写,剩余字母变成小写。
请你返回 大写后 的
title
。
2024年3月12日
【leetcode】1261. 在受污染的二叉树中查找元素
题意:
给出一个满足下述规则的二叉树:
root.val == 0
- 如果
treeNode.val == x
且treeNode.left != null
,那么treeNode.left.val == 2 * x + 1
- 如果
treeNode.val == x
且treeNode.right != null
,那么treeNode.right.val == 2 * x + 2
现在这个二叉树受到「污染」,所有的
treeNode.val
都变成了-1
。请你先还原二叉树,然后实现
FindElements
类:
FindElements(TreeNode* root)
用受污染的二叉树初始化对象,你需要先把它还原。bool find(int target)
判断目标值target
是否存在于还原后的二叉树中并返回结果。
2024年3月13日
【leetcode】2864. 最大二进制奇数
题意:
给你一个 二进制 字符串
s
,其中至少包含一个'1'
。你必须按某种方式 重新排列 字符串中的位,使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。
以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。
注意 返回的结果字符串 可以 含前导零。
2024年3月14日
【leetcode】2789. 合并后数组中的最大元素
题意:
给你一个下标从 0 开始、由正整数组成的数组
nums
。你可以在数组上执行下述操作 任意 次:
- 选中一个同时满足
0 <= i < nums.length - 1
和nums[i] <= nums[i + 1]
的整数i
。将元素nums[i + 1]
替换为nums[i] + nums[i + 1]
,并从数组中删除元素nums[i]
。返回你可以从最终数组中获得的 最大 元素的值。
2024年3月16日
【leetcode】2684. 矩阵中移动的最大次数
题意:
给你一个下标从 0 开始、大小为
m x n
的矩阵grid
,矩阵由若干 正 整数组成。你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历
grid
:
- 从单元格
(row, col)
可以移动到(row - 1, col + 1)
、(row, col + 1)
和(row + 1, col + 1)
三个单元格中任一满足值 严格 大于当前单元格的单元格。返回你在矩阵中能够 移动 的 最大 次数。
2024年3月17日
【leetcode】310. 最小高度树
题意:
树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
给你一棵包含
n
个节点的树,标记为0
到n - 1
。给定数字n
和一个有n - 1
条无向边的edges
列表(每一个边都是一对标签),其中edges[i] = [ai, bi]
表示树中节点ai
和bi
之间存在一条无向边。可选择树中任何一个节点作为根。当选择节点
x
作为根节点时,设结果树的高度为h
。在所有可能的树中,具有最小高度的树(即,min(h)
)被称为 最小高度树 。请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。
树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。
2024年3月18日
【leetcode】303. 区域和检索 - 数组不可变
题意:
给定一个整数数组
nums
,处理以下类型的多个查询:
- 计算索引
left
和right
(包含left
和right
)之间的nums
元素的 和 ,其中left <= right
实现
NumArray
类:
NumArray(int[] nums)
使用数组nums
初始化对象int sumRange(int i, int j)
返回数组nums
中索引left
和right
之间的元素的 总和 ,包含left
和right
两点(也就是nums[left] + nums[left + 1] + ... + nums[right]
)
2024年3月19日
【leetcode】160. 相交链表
题意:
给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
2024年3月20日
【leetcode】1969. 数组元素的最小非零乘积
题意:
给你一个正整数
p
。你有一个下标从 1 开始的数组nums
,这个数组包含范围[1, 2p - 1]
内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:
- 从
nums
中选择两个元素x
和y
。- 选择
x
中的一位与y
对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。比方说,如果
x = 11*0*1
且y = 00*1*1
,交换右边数起第2
位后,我们得到x = 11*1*1
和y = 00*0*1
。请你算出进行以上操作 任意次 以后,
nums
能得到的 最小非零 乘积。将乘积对109 + 7
取余 后返回。注意:答案应为取余 之前 的最小值。
2024年3月21日
【leetcode】2671. 频率跟踪器
题意:
请你设计并实现一个能够对其中的值进行跟踪的数据结构,并支持对频率相关查询进行应答。
实现
FrequencyTracker
类:
FrequencyTracker()
:使用一个空数组初始化FrequencyTracker
对象。void add(int number)
:添加一个number
到数据结构中。void deleteOne(int number)
:从数据结构中删除一个number
。数据结构 可能不包含number
,在这种情况下不删除任何内容。bool hasFrequency(int frequency)
: 如果数据结构中存在出现frequency
次的数字,则返回true
,否则返回false
。
2024年3月23日
【leetcode】2549. 统计桌面上的不同数字
题意:
给你一个正整数
n
,开始时,它放在桌面上。在109
天内,每天都要执行下述步骤:
- 对于出现在桌面上的每个数字
x
,找出符合1 <= i <= n
且满足x % i == 1
的所有数字i
。- 然后,将这些数字放在桌面上。
返回在
109
天之后,出现在桌面上的 不同 整数的数目。注意:
- 一旦数字放在桌面上,则会一直保留直到结束。
%
表示取余运算。例如,14 % 3
等于2
。
2024年3月24日
【leetcode】322. 零钱兑换
题意:
给你一个整数数组
coins
,表示不同面额的硬币;以及一个整数amount
,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回
-1
。你可以认为每种硬币的数量是无限的。
2024年3月25日
【leetcode】518. 零钱兑换 II
题意:
给你一个整数数组
coins
表示不同面额的硬币,另给一个整数amount
表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回
0
。假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
2024年3月26日
【leetcode】2642. 设计可以求最短路径的图类
题意:
给你一个有
n
个节点的 有向带权 图,节点编号为0
到n - 1
。图中的初始边用数组edges
表示,其中edges[i] = [fromi, toi, edgeCosti]
表示从fromi
到toi
有一条代价为edgeCosti
的边。请你实现一个
Graph
类:
Graph(int n, int[][] edges)
初始化图有n
个节点,并输入初始边。addEdge(int[] edge)
向边集中添加一条边,其中edge = [from, to, edgeCost]
。数据保证添加这条边之前对应的两个节点之间没有有向边。int shortestPath(int node1, int node2)
返回从节点node1
到node2
的路径 最小 代价。如果路径不存在,返回-1
。一条路径的代价是路径中所有边代价之和。
2024年3月27日
【leetcode】2580. 统计将重叠区间合并成组的方案数
题意:
给你一个二维整数数组
ranges
,其中ranges[i] = [starti, endi]
表示starti
到endi
之间(包括二者)的所有整数都包含在第i
个区间中。你需要将
ranges
分成 两个 组(可以为空),满足:
- 每个区间只属于一个组。
- 两个有 交集 的区间必须在 同一个 组内。
如果两个区间有至少 一个 公共整数,那么这两个区间是 有交集 的。
- 比方说,区间
[1, 3]
和[2, 5]
有交集,因为2
和3
在两个区间中都被包含。请你返回将
ranges
划分成两个组的 总方案数 。由于答案可能很大,将它对10^9 + 7
取余 后返回。
2024年3月28日
【leetcode】1997. 访问完所有房间的第一天
题意:
你需要访问
n
个房间,房间从0
到n - 1
编号。同时,每一天都有一个日期编号,从0
开始,依天数递增。你每天都会访问一个房间。最开始的第
0
天,你访问0
号房间。给你一个长度为n
且 下标从 0 开始 的数组nextVisit
。在接下来的几天中,你访问房间的 次序 将根据下面的 规则 决定:
- 假设某一天,你访问
i
号房间。- 如果算上本次访问,访问
i
号房间的次数为 奇数 ,那么 第二天 需要访问nextVisit[i]
所指定的房间,其中0 <= nextVisit[i] <= i
。- 如果算上本次访问,访问
i
号房间的次数为 偶数 ,那么 第二天 需要访问(i + 1) mod n
号房间。请返回你访问完所有房间的第一天的日期编号。题目数据保证总是存在这样的一天。由于答案可能很大,返回对
10^9 + 7
取余后的结果。
2024年3月29日
【leetcode】2908. 元素和最小的山形三元组 I
题意:
给你一个下标从 0 开始的整数数组
nums
。如果下标三元组
(i, j, k)
满足下述全部条件,则认为它是一个 山形三元组 :
i < j < k
nums[i] < nums[j]
且nums[k] < nums[j]
请你找出
nums
中 元素和最小 的山形三元组,并返回其 元素和 。如果不存在满足条件的三元组,返回-1
。
2024年3月30日
【leetcode】2952. 需要添加的硬币的最小数量
题意:
给你一个下标从 0 开始的整数数组
coins
,表示可用的硬币的面值,以及一个整数target
。如果存在某个
coins
的子序列总和为x
,那么整数x
就是一个 可取得的金额 。返回需要添加到数组中的 任意面值 硬币的 最小数量 ,使范围
[1, target]
内的每个整数都属于 可取得的金额 。数组的 子序列 是通过删除原始数组的一些(可能不删除)元素而形成的新的 非空 数组,删除过程不会改变剩余元素的相对位置。
2024年3月31日
【leetcode】331. 验证二叉树的前序序列化
题意:
序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如
#
。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
保证 每个以逗号分隔的字符或为一个整数或为一个表示
null
指针的'#'
。你可以认为输入格式总是有效的
- 例如它永远不会包含两个连续的逗号,比如
"1,,3"
。注意:不允许重建树。