leetcode weekly contest 335
leetcode weekly contest 335
本场周赛的题目的第三题确实比较好的题目,难得见到高质量的第三题。
6307. 递枕头
n 个人站成一排,按从 1 到 n 编号。
最初,排在队首的第一个人拿着一个枕头。每秒钟,拿着枕头的人会将枕头传递给队伍中的下一个人。一旦枕头到达队首或队尾,传递方向就会改变,队伍会继续沿相反方向传递枕头。
- 例如,当枕头到达第
n个人时,TA 会将枕头传递给第n - 1个人,然后传递给第n - 2个人,依此类推。
给你两个正整数 n 和 time ,返回 time 秒后拿着枕头的人的编号。
示例 1:
1 | |
示例 2:
1 | |
提示:
2 <= n <= 10001 <= time <= 1000
地址
https://leetcode.cn/contest/weekly-contest-335/problems/pass-the-pillow/
题意
找规律即可
思路
- 每次来回需要花费的时间为 $2(n - 1)$,我们对 $2(n - 1)$ 进行取模:
- 如果余数大于 $n - 1$,此时需要的位置为 $2 * n - x - 1$;
- 如果余数小于等于 $n - 1$,此时需要的位置为 $1 + x$;
- 复杂度分析:
1 | |
6308. 二叉树中的第 K 大层和
给你一棵二叉树的根节点 root 和一个正整数 k 。
树中的 层和 是指 同一层 上节点值的总和。
返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。
注意,如果两个节点与根节点的距离相同,则认为它们在同一层。
示例 1:

1 | |
示例 2:

1 | |
提示:
- 树中的节点数为
n 2 <= n <= 1051 <= Node.val <= 1061 <= k <= n
地址
https://leetcode.cn/contest/weekly-contest-335/problems/kth-largest-sum-in-a-binary-tree/
题意
层次遍历
思路
- 直接利用 $BFS$ 将二叉树中所有层次的和求出来,然后将其排序取最大的第 $k$ 的数即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为二叉树节点的数目。
- 空间复杂度:$O(n)$,其中 $n$ 为二叉树节点的数目。
代码
1 | |
6309. 分割数组使乘积互质
给你一个长度为 n 的整数数组 nums ,下标从 0 开始。
如果在下标 i 处 分割 数组,其中 0 <= i <= n - 2 ,使前 i + 1 个元素的乘积和剩余元素的乘积互质,则认为该分割 有效 。
- 例如,如果
nums = [2, 3, 3],那么在下标i = 0处的分割有效,因为2和9互质,而在下标i = 1处的分割无效,因为6和3不互质。在下标i = 2处的分割也无效,因为i == n - 1。
返回可以有效分割数组的最小下标 i ,如果不存在有效分割,则返回 -1 。
当且仅当 gcd(val1, val2) == 1 成立时,val1 和 val2 这两个值才是互质的,其中 gcd(val1, val2) 表示 val1 和 val2 的最大公约数。
示例 1:
1 | |
示例 2:
1 | |
提示:
n == nums.length1 <= n <= 1041 <= nums[i] <= 106
地址
https://leetcode.cn/contest/weekly-contest-335/problems/split-the-array-to-make-coprime-products/
题意
质数区+间合并
思路
- 对每个元素的质因子分解,并求出所有的含有质因子 $x$ 覆盖的最大区间为 $[start, end]$,这表示区间 $[start,end]$ 在划分时一定要划分到一起,要么全部划分到左边,要么全部划分到右边,我们在筛选时没有必要筛选 $[2,U]$,实际我们只需要筛选 $[2,\sqrt{U}]$ 即可,将 $[2,\sqrt{U}]$ 筛选完成后,剩下的数必然为质数。
- 我们假设质数 $a$ 的覆盖区间为 $[l_1,r_1]$,质数 $b$ 的覆盖区间为 $[l_2,r_2]$,假设二者之间存在交集,则可以推出这两个区间一定需要划分在一个分组中,即这两个区间可以合并为 $[\min(l_1,l_2),\max(r_1,r_2)]$,参考「6313. 统计将重叠区间合并成组的方案数」我们找到左侧第一个不相交的集合并从该处划分开即可。
假设存在数组 $[2,6,4,3]$,此时我们知道含有质因子 $2$ 必须要划分在一起的区间为 $[0,2]$,含有质因子 $3$ 必须要划分在一起的区间为 $[1,3]$,此时由于二者存在交集,因此 $[0,4]$ 这个区间中所有数必须要划分在同一个分组中,否则不能满足题目要求。 - 我们将质因子覆盖的区间从小到大进行排序,并对从左到右进行合并,找到第一个不想交的区间,即可从此处划分开来。
- 复杂度分析:
- 时间复杂度:$O(n \log U )$,其中 $n$ 为数组的长度,$U$ 表示数组中的最大元素。
- 空间复杂度:$O(\log U)$。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Solution {
public:
int findValidSplit(vector<int>& nums) {
int maxVal = *max_element(nums.begin(), nums.end());
int n = nums.size();
int m = sqrt(maxVal) + 3;
vector<int> primer;
vector<bool> visit(m + 1, false);
for (int i = 2; i <= m; i++) {
if (!visit[i]) {
primer.emplace_back(i);
for (int j = i; j <= m; j += i) {
visit[i] = true;
}
}
}
unordered_map<int, vector<int>> cnt;
for (int i = 0; i < n; i++) {
int x = nums[i];
for (auto p : primer) {
if (p > x) break;
if (x % p) continue;
cnt[p].emplace_back(i);
while (x % p == 0) {
x /= p;
}
}
if (x > 1) {
cnt[x].emplace_back(i);
}
}
if (cnt.size() <= 1) {
return -1;
}
vector<pair<int, int>> arr;
for (auto [_, v] : cnt) {
arr.emplace_back(v[0], v.back());
}
sort(arr.begin(), arr.end());
int i = 0;
int last = arr[0].second;
while (i < arr.size() && arr[i].first <= last) {
last = max(last, arr[i].second);
i++;
}
if (i < arr.size()) {
return last;
}
return -1;
}
};
1 | |
6310. 获得分数的方法数
考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types ,其中 types[i] = [counti, marksi]表示第 i 种类型的题目有 counti 道,每道题目对应 marksi 分。
返回你在考试中恰好得到 target 分的方法数。由于答案可能很大,结果需要对 109 +7 取余。
注意,同类型题目无法区分。
- 比如说,如果有
3道同类型题目,那么解答第1和第2道题目与解答第1和第3道题目或者第2和第3道题目是相同的。
示例 1:
1 | |
示例 2:
1 | |
示例 3:
1 | |
提示:
1 <= target <= 1000n == types.length1 <= n <= 50types[i].length == 21 <= counti, marksi <= 50
地址
https://leetcode.cn/contest/weekly-contest-335/problems/number-of-ways-to-earn-points/
题意
动态规划
思路
- 经典的动态规划,设 $dp[i][x]$ 表示在前 $i$ 组中取出分数为 $x$ 的方法数,此时我们可以得到递推公式:即最后一个分组的取值范围为 $k \times marks_i$,其中 $k \in [0, count_i]$,应该是经典的动态规划题目了。
- 复杂度分析:
- 时间复杂度:$O(m \times n \times U)$,其中 $m$ 表示给定的分数,$n$ 表示题目类型的数目,$U$ 表示给定的题目最大数目。
- 空间复杂度:$O(m \times n)$。其中 $m$ 表示给定的分数,$n$ 表示题目类型的数目。
代码
1 | |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿

