leetcode biweekly contes 114
最近算是很水的题目了,T4
几乎是某次的原题目,确实比较简单,T3
构造题目不需要任何算法,感觉就是技巧。
8038. 收集元素的最少操作次数
给你一个正整数数组 nums
和一个整数 k
。
一次操作中,你可以将数组的最后一个元素删除,将该元素添加到一个集合中。
请你返回收集元素 1, 2, ..., k
需要的 最少操作次数 。
示例 1:
输入:nums = [3,1,5,4,2], k = 2 |
示例 2:
输入:nums = [3,1,5,4,2], k = 5 |
示例 3:
输入:nums = [3,2,5,3,1], k = 3 |
提示:
1 <= nums.length <= 50
1 <= nums[i] <= nums.length
1 <= k <= nums.length
- 输入保证你可以收集到元素
1, 2, ..., k
。
地址
https://leetcode.cn/contest/biweekly-contest-114/problems/minimum-operations-to-collect-elements/
题意
模拟 + 哈希
思路
- 直接倒序遍历,并用哈希表统计 $[1,k]$ 中出现的数字,如果全部出现则返回当前已经遍历的元素个数即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示数组的长度,。
- 空间复杂度:$O(k)$,其中 $k$ 表示给定的元素,。
代码
class Solution { |
100032. 使数组为空的最少操作次数
给你一个下标从 0 开始的正整数数组 nums
。
你可以对数组执行以下两种操作 任意次 :
- 从数组中选择 两个 值 相等 的元素,并将它们从数组中 删除 。
- 从数组中选择 三个 值 相等 的元素,并将它们从数组中 删除 。
请你返回使数组为空的 最少 操作次数,如果无法达成,请返回 -1
。
示例 1:
输入:nums = [2,3,3,2,2,4,2,3,4] |
示例 2:
输入:nums = [2,1,2,2,3,3] |
提示:
2 <= nums.length <= 105
1 <= nums[i] <= 106
地址
题意
数学
思路
- 题目每次直接消除相同的 $2$ 或者 $3$ 个元素,因此我们可以分几种讨论:
- 如果当前元素 $x$ 出现的次数为 $1$, 则此时无论如何都无法消除;
- 如果当前元素 $x$ 出现的次数大于 $1$:
- 如果当前 $x$ 出现的次数 $cnt[x]$ 刚好能被 $3$ 整除,则删除 $x$ 需要的最少此时为 $\dfrac{cnt[x]}{3}$;
- 如果当前 $x$ 出现的次数 $cnt[x]$ 被 $3$ 整除余数为 $2$,则删除 $x$ 需要的最少此时为 $\dfrac{cnt[x] - 2}{3} + 1$, 其中有 $2$ 个元素被一起删除;
- 如果当前 $x$ 出现的次数 $cnt[x]$ 被 $3$ 整除余数为 $1$,则删除 $x$ 需要的最少此时为 $\dfrac{cnt[x] - 4}{3} + 2$,其中有 $4$ 个元素被删除 $2$ 次;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为数组的长度。
- 空间复杂度:$O(n)$,其中 $n$ 为数组的长度。
代码
class Solution { |
100019. 将数组分割成最多数目的子数组
给你一个只包含 非负 整数的数组 nums
。
我们定义满足 l <= r
的子数组 nums[l..r]
的分数为 nums[l] AND nums[l + 1] AND ... AND nums[r]
,其中 AND 是按位与运算。
请你将数组分割成一个或者更多子数组,满足:
- 每个 元素都 只 属于一个子数组。
- 子数组分数之和尽可能 小 。
请你在满足以上要求的条件下,返回 最多 可以得到多少个子数组。
一个 子数组 是一个数组中一段连续的元素。
示例 1:
输入:nums = [1,0,2,0,1,2] |
示例 2:
输入:nums = [5,7,1,3] |
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 106
地址
https://leetcode.cn/contest/weekly-contest-364/problems/beautiful-towers-ii/
题意
贪心
思路
- 题目要求使得所有分组的得分之和最小,根据 与 操作的性质可以知道,所有分组之和的最小得分一定是所有元素的 AND 操作的结果,原因如下:
- 由于 AND 的性质可以知道 $A & B \le A, A & B \le B$, 即两个数进行与操作的结果一定小于等于任何一个元素,因此我们可以知道一定是分组为 $1$ 时,所有元素进行与操作后的结果最小;
- 需要注意的时,如果所有元素进行与操作的结果为 $0$ 时,由于 $0 + 0 = 0$ ,在这种情况下我们可以尝试将数组进行分组,使得每组元素与操作的结果都为 $0$, 因此本题目就转换成了找到连续分组元素中与操作为 $0$ 的分组数目;
- 此时操作就比较简单了,我们只需要每次计算连续分组元素进行与操作,计算结果为 $0$ 的次数即可;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中$n$ 表示数组的长度;
- 空间复杂度:$O(1)$;
代码
class Solution { |
8051. 可以被 K 整除连通块的最大数目
给你一棵 n
个节点的无向树,节点编号为 0
到 n - 1
。给你整数 n
和一个长度为 n - 1
的二维整数数组 edges
,其中 edges[i] = [ai, bi]
表示树中节点 ai
和 bi
有一条边。
同时给你一个下标从 0 开始长度为 n
的整数数组 values
,其中 values[i]
是第 i
个节点的 值 。再给你一个整数 k
。
你可以从树中删除一些边,也可以一条边也不删,得到若干连通块。一个 连通块的值 定义为连通块中所有节点值之和。如果所有连通块的值都可以被 k
整除,那么我们说这是一个 合法分割 。
请你返回所有合法分割中,连通块数目的最大值 。
示例 1:
输入:n = 5, edges = [[0,2],[1,2],[1,3],[2,4]], values = [1,8,1,4,4], k = 6 |
示例 2:
输入:n = 7, edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]], values = [3,0,6,1,5,2,1], k = 3 |
提示:
1 <= n <= 3 * 104
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
values.length == n
0 <= values[i] <= 109
1 <= k <= 109
values
之和可以被k
整除。- 输入保证
edges
是一棵无向树。
地址
https://leetcode.cn/contest/biweekly-contest-114/problems/maximum-number-of-k-divisible-components/
题意
DFS
思路
- 本题与某个题目应该是一模一样的题目,感觉基本上不用思考的题目了,每次计算以当前节点为根节点且构造能被 $k$ 整除的连通单元之和被 $k$ 整除之后的余数,假设当前节点的和加上其叶子节点的分割后的剩余的返回值之和,如果构成的连通单元可以被 $k$ 整除则计算加 $1$, 否则返回被 $k$ 整除后的余数;
- 复杂度分析:
- 时间复杂度:$O(E + V)$,其中 $V$ 表示树中节点的数目, $E$ 表示树中边的数目。
- 空间复杂度:$O(E + V)$,其中 $V$ 表示树中节点的数目, $E$ 表示树中边的数目。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章