leetcode weekly contest 332
周赛的题目竟然越来越偏向于思维的题目,第四题会的话就非常简单,不会的会就容易卡住,难得又AK
一次。
6354. 找出数组的串联值
给你一个下标从 0 开始的整数数组 nums
。
现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。
- 例如,
15
和49
的串联是1549
。
nums
的 串联值 最初等于 0
。执行下述操作直到 nums
变为空:
- 如果
nums
中存在不止一个数字,分别选中nums
中的第一个元素和最后一个元素,将二者串联得到的值加到nums
的 串联值 上,然后从nums
中删除第一个和最后一个元素。 - 如果仅存在一个元素,则将该元素的值加到
nums
的串联值上,然后删除这个元素。
返回执行完所有操作后 nums
的串联值。
示例 1:
输入:nums = [7,52,2,4] |
示例 2:
输入:nums = [5,14,13,8,12] |
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 104
地址
https://leetcode.cn/contest/weekly-contest-332/problems/find-the-array-concatenation-value/
题意
直接模拟
思路
- 简单题目,我们直接模拟即可,每次对数组的首和尾取出元素然后拼接相加即可;
- 复杂度分析:
- 时间复杂度:$O(n + \log u)$,其中 $n$ 为数组的长度,$u$ 为数组中最大的元素。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6355. 统计公平数对的数目
给你一个下标从 0 开始、长度为 n
的整数数组 nums
,和两个整数 lower
和 upper
,返回 公平数对的数目 。
如果 (i, j)
数对满足以下情况,则认为它是一个 公平数对 :
0 <= i < j < n
,且lower <= nums[i] + nums[j] <= upper
示例 1:
输入:nums = [0,1,7,4,4,5], lower = 3, upper = 6 |
示例 2:
输入:nums = [1,7,9,2,5], lower = 11, upper = 11 |
提示:
1 <= nums.length <= 105
nums.length == n
-109 <= nums[i] <= 109
-109 <= lower <= upper <= 109
地址
https://leetcode.cn/contest/weekly-contest-332/problems/count-the-number-of-fair-pairs/
题意
二分查找、双指针
思路
- 典型的二分查找,不过查找范围为左右两个端点,首先对数组进行排序,对于每个元素 $nums[i]$ 我们查找处在区间 $[lower - nums[i],upper-nums[i]]$ 中的元素数目即可。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 为数组的长度。每次二分查找需要的时间为 $\log n$。
- 空间复杂度:$O(\log n)$,主要为排序需要空间。
代码
- 二分查找
class Solution { |
- 双指针
6356. 子字符串异或查询
给你一个 二进制字符串 s
和一个整数数组 queries
,其中 queries[i] = [firsti, secondi]
。
对于第 i
个查询,找到 s
的 最短子字符串 ,它对应的 十进制值 val
与 firsti
按位异或 得到 secondi
,换言之,val ^ firsti == secondi
。
第 i
个查询的答案是子字符串 [lefti, righti]
的两个端点(下标从 0 开始),如果不存在这样的子字符串,则答案为 [-1, -1]
。如果有多个答案,请你选择 lefti
最小的一个。
请你返回一个数组 ans
,其中 ans[i] = [lefti, righti]
是第 i
个查询的答案。
子字符串 是一个字符串中一段连续非空的字符序列。
示例 1:
输入:s = "101101", queries = [[0,5],[1,2]] |
示例 2:
输入:s = "0101", queries = [[12,8]] |
示例 3:
输入:s = "1", queries = [[4,5]] |
提示:
1 <= s.length <= 104
s[i]
要么是'0'
,要么是'1'
。1 <= queries.length <= 105
0 <= firsti, secondi <= 109
地址
https://leetcode.cn/contest/weekly-contest-332/problems/substring-xor-queries/
题意
贪心
思路
题目几个重要的提示:
val ^ firsti == secondi
,此时我们可以通过交换得到 $val = firsti \oplus secondi$,此时我们只需要找到最短的字符串使得其转换后的整数值等于 $val$ 即可;- 由于整数最多只含有 $32$ 位二进制数,因此我们只需要计算长度小于等于 $32$ 的字符串转换后的数字,并记录其起始位置与结束位置;
- 由于二进制数有前导 $0$ 的存在,因此我们每次从最短的位开始查找即可;
通过以上分析,我们计算出所有长度 $1-32$ 长的子串的值即可,然后查找每个转换后的值等于查询的值的最小区间即可。
复杂度分析
- 时间复杂度:时间复杂度为 $O(Cn)$,$n$ 表示数组的长度,$C$ 表示给定的常数。
- 空间复杂度:时间复杂度为 $O(Cn)$。
代码
class Solution { |
6357. 最少得分子序列
给你两个字符串 s
和 t
。
你可以从字符串 t
中删除任意数目的字符。
如果没有从字符串 t
中删除字符,那么得分为 0
,否则:
- 令
left
为删除字符中的最小下标。 - 令
right
为删除字符中的最大下标。
字符串的得分为 right - left + 1
。
请你返回使 t
成为 s
子序列的最小得分。
一个字符串的 子序列 是从原字符串中删除一些字符后(也可以一个也不删除),剩余字符不改变顺序得到的字符串。(比方说 "ace"
是 "***a\***b***c\***d***e\***"
的子序列,但是 "aec"
不是)。
示例 1:
输入:s = "abacaba", t = "bzaa" |
示例 2:
输入:s = "cde", t = "xyz" |
提示:
1 <= s.length, t.length <= 105
s
和t
都只包含小写英文字母。
地址
https://leetcode.cn/contest/weekly-contest-332/problems/subsequence-with-the-minimum-score/
题意
二分查找或者双指针
思路
- 二分查找:题目典型的问题可以用前后缀加二分的思路来解决:
- 设当前字符串 $t$ 的前缀 $t[0\cdots j]$ 可以匹配到字符 $s$ 的前 $i$ 个字符,此时我们只需要找到字符串 $s$ 的后缀 $s[(i + 1) \cdots (m-1)]$ 最多可以匹配到 $t$ 的后缀 $t[(j + 1) \cdots (n -1)]$ 的最大长度即可,假设 $s[i \cdots (m-1)]$ 可以匹配 $t[k \cdots (n -1)]$,此时我们只需要删除的字符串为 $t[(j + 1) \cdots (k-1)]$,此时的得分为 $(k - 1) - (j + 1) + 1$。
- 如果找到两个后缀 $s[(i + 1) \cdots (m-1)]$ 与 $t[k \cdots (n -1)]$ 的最长匹配即可。
- 如果 $t$ 不能完全匹配 $s$ 时,我们可以推出的是后缀 $s[i \cdots (m-1)]$ 最多可以匹配到 $t$ 的第 $j+1$ 个字符,否则一定完全匹配;
- 如果 $s$ 与 $t$ 可以完全匹配,直接返回 $0$;
- 我们利用二分查找直接找到后缀 $s[(i + 1) \cdots (m-1)]$ 与 $t$ 的最长匹配即可;
- 双指针: 删除 $t$ 的中间部分后,剩余部分是 $t$ 的一个前缀和一个后缀,设前缀与后缀分别为 $t[0 \cdots l]$ 与 $t[r \cdots (n-1)]$,则 $t[0 \cdots l]$ 一定可以匹配 $s[0 \cdots i]$,$t[r \cdots (n-1)]$ 一定可以匹配 $s[(i + 1) \cdots (m-1)]$,此时我们枚举 $i$,分别求出 $s[0 \cdots i]$ 与 $t$ 前缀的最长匹配,$s[(i + 1) \cdots (m-1)]$ 与 $t$ 的后缀的最长匹配,剩余的部分即为去掉的最小部分。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 为数组的长度。
- 空间复杂度:$O(n)$。
代码
- 二分查找:
class Solution { |
- 双指针:
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章