leetcode weekly contest 335
本场周赛的题目的第三题确实比较好的题目,难得见到高质量的第三题。
6307. 递枕头
n
个人站成一排,按从 1
到 n
编号。
最初,排在队首的第一个人拿着一个枕头。每秒钟,拿着枕头的人会将枕头传递给队伍中的下一个人。一旦枕头到达队首或队尾,传递方向就会改变,队伍会继续沿相反方向传递枕头。
- 例如,当枕头到达第
n
个人时,TA 会将枕头传递给第n - 1
个人,然后传递给第n - 2
个人,依此类推。
给你两个正整数 n
和 time
,返回 time
秒后拿着枕头的人的编号。
示例 1:
输入:n = 4, time = 5 |
示例 2:
输入:n = 3, time = 2 |
提示:
2 <= n <= 1000
1 <= 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$;
- 复杂度分析:
- 时间复杂度:$O(1)$。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6308. 二叉树中的第 K 大层和
给你一棵二叉树的根节点 root
和一个正整数 k
。
树中的 层和 是指 同一层 上节点值的总和。
返回树中第 k
大的层和(不一定不同)。如果树少于 k
层,则返回 -1
。
注意,如果两个节点与根节点的距离相同,则认为它们在同一层。
示例 1:
输入:root = [5,8,9,2,1,3,7,4,6], k = 2 |
示例 2:
输入:root = [1,2,null,3], k = 1 |
提示:
- 树中的节点数为
n
2 <= n <= 105
1 <= Node.val <= 106
1 <= 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$ 为二叉树节点的数目。
代码
class Solution { |
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:
输入:nums = [4,7,8,15,3,5] |
示例 2:
输入:nums = [4,7,15,8,3,5] |
提示:
n == nums.length
1 <= n <= 104
1 <= 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)$。
代码
class Solution { |
6310. 获得分数的方法数
考试中有 n
种类型的题目。给你一个整数 target
和一个下标从 0 开始的二维整数数组 types
,其中 types[i] = [counti, marksi]
表示第 i
种类型的题目有 counti
道,每道题目对应 marksi
分。
返回你在考试中恰好得到 target
分的方法数。由于答案可能很大,结果需要对 109 +7
取余。
注意,同类型题目无法区分。
- 比如说,如果有
3
道同类型题目,那么解答第1
和第2
道题目与解答第1
和第3
道题目或者第2
和第3
道题目是相同的。
示例 1:
输入:target = 6, types = [[6,1],[3,2],[2,3]] |
示例 2:
输入:target = 5, types = [[50,1],[50,2],[50,5]] |
示例 3:
输入:target = 18, types = [[6,1],[3,2],[2,3]] |
提示:
1 <= target <= 1000
n == types.length
1 <= n <= 50
types[i].length == 2
1 <= counti, marksi <= 50
地址
https://leetcode.cn/contest/weekly-contest-335/problems/number-of-ways-to-earn-points/
题意
动态规划
思路
经典的动态规划,设 $dp[i][x]$ 表示在前 $i$ 组中取出分数为 $x$ 的方法数,此时我们可以得到递推公式:
$$
dp[i + 1][x] = \sum_{k=0}^{t_{i+1}[1]}dp[i][x - k * t_{i + 1}[0]]
$$
即最后一个分组的取值范围为 $k \times marks_i$,其中 $k \in [0, count_i]$,应该是经典的动态规划题目了。复杂度分析:
- 时间复杂度:$O(m \times n \times U)$,其中 $m$ 表示给定的分数,$n$ 表示题目类型的数目,$U$ 表示给定的题目最大数目。
- 空间复杂度:$O(m \times n)$。其中 $m$ 表示给定的分数,$n$ 表示题目类型的数目。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章