leetcode biweekly contest 126
总体来说,双周赛的题目难度确实还是挺高的,题目质量也是很好,不过有一些偏竞赛的题目。
3079. 求出加密整数的和
给你一个整数数组 nums
,数组中的元素都是 正 整数。定义一个加密函数 encrypt
,encrypt(x)
将一个整数 x
中 每一个 数位都用 x
中的 最大 数位替换。比方说 encrypt(523) = 555
且 encrypt(213) = 333
。
请你返回数组中所有元素加密后的 和 。
示例 1:
输入:nums = [1,2,3]
输出:6
解释:加密后的元素位 [1,2,3]
。加密元素的和为 1 + 2 + 3 == 6
。
示例 2:
输入:nums = [10,21,31]
输出:66
解释:加密后的元素为 [11,22,33]
。加密元素的和为 11 + 22 + 33 == 66
。
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 1000
地址
https://leetcode.cn/contest/biweekly-contest-126/problems/find-the-sum-of-encrypted-integers/
题意
模拟
思路
- 按照题目要求进行模拟即可,并返回所有结果的和即可。
- 复杂度分析:
- 时间复杂度:$O(n \log U)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
impl Solution { |
3080. 执行操作标记数组中的元素
给你一个长度为 n
下标从 0 开始的正整数数组 nums
。
同时给你一个长度为 m
的二维操作数组 queries
,其中 queries[i] = [indexi, ki]
。
一开始,数组中的所有元素都 未标记 。
你需要依次对数组执行 m
次操作,第 i
次操作中,你需要执行:
- 如果下标
indexi
对应的元素还没标记,那么标记这个元素。 - 然后标记
ki
个数组中还没有标记的 最小 元素。如果有元素的值相等,那么优先标记它们中下标较小的。如果少于ki
个未标记元素存在,那么将它们全部标记。
请你返回一个长度为 m
的数组 answer
,其中 answer[i]
是第 i
次操作后数组中还没标记元素的 和 。
示例 1:
输入:nums = [1,2,2,1,2,3,1], queries = [[1,2],[3,3],[4,2]]
输出:[8,3,0]
解释:
我们依次对数组做以下操作:
- 标记下标为
1
的元素,同时标记2
个未标记的最小元素。标记完后数组为nums = [***1***,***2***,2,***1***,2,3,1]
。未标记元素的和为2 + 2 + 3 + 1 = 8
。 - 标记下标为
3
的元素,由于它已经被标记过了,所以我们忽略这次标记,同时标记最靠前的3
个未标记的最小元素。标记完后数组为nums = [***1***,***2***,***2***,***1***,***2***,3,***1***]
。未标记元素的和为3
。 - 标记下标为
4
的元素,由于它已经被标记过了,所以我们忽略这次标记,同时标记最靠前的2
个未标记的最小元素。标记完后数组为nums = [***1***,***2***,***2***,***1***,***2***,***3***,***1***]
。未标记元素的和为0
。
示例 2:
输入:nums = [1,4,2,3], queries = [[0,1]]
输出:[7]
解释:我们执行一次操作,将下标为 0
处的元素标记,并且标记最靠前的 1
个未标记的最小元素。标记完后数组为 nums = [***1***,4,***2***,3]
。未标记元素的和为 4 + 3 = 7
。
提示:
n == nums.length
m == queries.length
1 <= m <= n <= 105
1 <= nums[i] <= 105
queries[i].length == 2
0 <= indexi, ki <= n - 1
地址
题意
排序
思路
- 根据题目要求,对数组中每个元素进行标记,每次从数组中取出元素时,依次按照从小到大顺序取出数据,取出 $k$ 个位被标记的元素,并同时进行标记即可,还算是中规中距的题目,不算太难。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(n)$, 其中 $n$ 表示给定数组的长度。
代码
class Solution: |
impl Solution { |
3081. 替换字符串中的问号使分数最小
给你一个字符串 s
。s[i]
要么是小写英文字母,要么是问号 '?'
。
对于长度为 m
且 只 含有小写英文字母的字符串 t
,我们定义函数 cost(i)
为下标 i
之前(也就是范围 [0, i - 1]
中)出现过与 t[i]
相同 字符出现的次数。
字符串 t
的 分数 为所有下标 i
的 cost(i)
之 和 。
比方说,字符串 t = "aab"
:
cost(0) = 0
cost(1) = 1
cost(2) = 0
- 所以,字符串
"aab"
的分数为0 + 1 + 0 = 1
。
你的任务是用小写英文字母 替换 s
中 所有 问号,使 s
的 分数****最小 。
请你返回替换所有问号 '?'
之后且分数最小的字符串。如果有多个字符串的 分数最小 ,那么返回字典序最小的一个。
示例 1:
输入:s = “???”
输出: “abc”
解释:这个例子中,我们将 s
中的问号 '?'
替换得到 "abc"
。
对于字符串 "abc"
,cost(0) = 0
,cost(1) = 0
和 cost(2) = 0
。
"abc"
的分数为 0
。
其他修改 s
得到分数 0
的字符串为 "cba"
,"abz"
和 "hey"
。
这些字符串中,我们返回字典序最小的。
示例 2:
输入: s = “a?a?”
输出: “abac”
解释:这个例子中,我们将 s
中的问号 '?'
替换得到 "abac"
。
对于字符串 "abac"
,cost(0) = 0
,cost(1) = 0
,cost(2) = 1
和 cost(3) = 0
。
"abac"
的分数为 1
。
提示:
1 <= s.length <= 105
s[i]
要么是小写英文字母,要么是'?'
。
地址
题意
贪心
思路
题目要求总的分数最小,首先我们需要明确一点是,假设给定的字符 $c$ 出现的次数为 $cnt$ ,则此时该字符 $c$ 的得分即为 $\dfrac{cnt\times(cnt -1)}{2}$,根据这个原则可以知道,如果每个字符串出现的次数越少,则总的分数也就越少,我们的目标即使得字符串中每个字符出现的总此时尽可能的少即可,此时我们统计所有的 $?$ 的次数,并将这些位置贪心的分配给频次最少的字符即可。
复杂度分析:
- 时间复杂度:$O(n \times \Sigma)$, $n$ 表示给定字符串数组的长度, $\Sigma$ 表示字符的种类;
- 空间复杂度:$O(n)$,, $n$ 表示定字符串数组的长度
代码
class Solution: |
impl Solution { |
3082. 求出所有子序列的能量和
给你一个长度为 n
的整数数组 nums
和一个 正 整数 k
。
一个整数数组的 能量 定义为和 等于 k
的子序列的数目。
请你返回 nums
中所有子序列的 能量和 。
由于答案可能很大,请你将它对 109 + 7
取余 后返回。
示例 1:
输入: nums = [1,2,3], k = 3
输出: 6
解释:
总共有 5
个能量不为 0 的子序列:
- 子序列
[***1***,***2***,***3***]
有2
个和为3
的子序列:[1,2,***3\***]
和[***1\***,***2\***,3]
。 - 子序列
[***1***,2,***3***]
有1
个和为3
的子序列:[1,2,***3\***]
。 - 子序列
[1,***2***,***3***]
有1
个和为3
的子序列:[1,2,***3\***]
。 - 子序列
[***1***,***2***,3]
有1
个和为3
的子序列:[***1\***,***2\***,3]
。 - 子序列
[1,2,***3***]
有1
个和为3
的子序列:[1,2,***3\***]
。
所以答案为 2 + 1 + 1 + 1 + 1 = 6
。
示例 2:
输入: nums = [2,3,3], k = 5
输出: 4
解释:
总共有 3
个能量不为 0 的子序列:
- 子序列
[***2***,***3***,***3***]
有 2 个子序列和为5
:[***2\***,3,***3\***]
和[***2\***,***3\***,3]
。 - 子序列
[***2***,3,***3***]
有 1 个子序列和为5
:[***2\***,3,***3\***]
。 - 子序列
[***2***,***3***,3]
有 1 个子序列和为5
:[***2\***,***3\***,3]
。
所以答案为 2 + 1 + 1 = 4
。
示例 3:
输入: nums = [1,2,3], k = 7
输出: 0
解释:不存在和为 7
的子序列,所以 nums
的能量和为 0
。
提示:
1 <= n <= 100
1 <= nums[i] <= 104
1 <= k <= 100
地址
题意
动态规划
思路
- 对于每个和为 $k$ 的子序列 $list$,且它的长度为 $c$,此时其余的元素可以选择或者不选,此时可以构成一定含有 $list$ 的子序列 $2^{n-k}$ 个,此时我们只需要计算含有长度为 $c$ 的子序列的数目即可,此时可以知道总的数目即为:$$ T = \sum_{i=1}^{n}f[i][k]$$,其中 $f[i][k]$ 表示长度为 $i$ 且元素和为 $k$ 的子序列数目。此时直接按照递推公式即可
- 如果不选择当前的 $x$,则此时 $f[i][k] = f[i][k]$;
- 如果选择当前的 $x$,则此时可以推出 $f[i][k] = f[i][k] + f[i-1][k - x]$;
- 复杂度分析:
- 时间复杂度:$O(n^2k)$,其中 $n$ 表示给定数组的长度,$k$ 表示给定的整数。
- 空间复杂度:$O(nk)$,其中 $n$ 表示给定数组的长度,$k$ 表示给定的整数。
代码
class Solution: |
impl Solution { |
欢迎关注和打赏,感谢支持!
扫描二维码,分享此文章