leetcode contest 384
最近周赛比较简单,双周赛难度有所上升,本周最难的题目是 t3, 其余的题目比较简单。
100230. 修改矩阵
给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。
返回矩阵 answer 。
示例 1:

输入:matrix = [[1,2,-1],[4,-1,6],[7,8,9]] |
示例 2:

输入:matrix = [[3,-1],[5,2]] |
提示:
m == matrix.lengthn == matrix[i].length2 <= m, n <= 50-1 <= matrix[i][j] <= 100- 测试用例中生成的输入满足每列至少包含一个非负整数。
地址
https://leetcode.cn/contest/weekly-contest-384/problems/modify-the-matrix/
题意
直接模拟即可
思路
- 直接模拟即可,用每一列的最大值替换
-1即可; - 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
3036. 匹配模式数组的子数组数目 II
给你一个下标从 0 开始长度为 n 的整数数组 nums ,和一个下标从 0 开始长度为 m 的整数数组 pattern ,pattern 数组只包含整数 -1 ,0 和 1 。
大小为 m + 1 的子数组 nums[i..j] 如果对于每个元素 pattern[k] 都满足以下条件,那么我们说这个子数组匹配模式数组 pattern :
- 如果
pattern[k] == 1,那么nums[i + k + 1] > nums[i + k] - 如果
pattern[k] == 0,那么nums[i + k + 1] == nums[i + k] - 如果
pattern[k] == -1,那么nums[i + k + 1] < nums[i + k]
请你返回匹配 pattern 的 nums 子数组的 数目 。
示例 1:
输入:nums = [1,2,3,4,5,6], pattern = [1,1] |
示例 2:
输入:nums = [1,4,4,1,3,5,5,3], pattern = [1,0,-1] |
提示:
2 <= n == nums.length <= 1061 <= nums[i] <= 1091 <= m == pattern.length < n-1 <= pattern[i] <= 1
地址
https://leetcode.cn/contest/weekly-contest-384/problems/number-of-subarrays-that-match-a-pattern-ii/
题意
字符串哈希算法,KMP
思路
- 本题与上周的题目几乎一样的解法,最直接的办法就是字符串哈希
KR算法或者KMP, 由于给定的模式只关系到数组中两个相邻的元素,此时我们首先可以将数组转换为模式匹配的目标数,然后在该数组的模式匹配中查找pattern一共出现多少次即可。经典的解法就是字符串匹配即可,即匹配当前字符串在目标字符串中出现的次数即可,我们可以用KR算法或者KMP算法即可。 - 复杂度分析:
- 时间复杂度:$O(n)$, $n$ 表示给定字符串 $s$ 的长度;
- 空间复杂度:$O(n)$;
代码
class Solution: |
100219. 回文字符串的最大数量
给你一个下标从 0 开始的字符串数组 words ,数组的长度为 n ,且包含下标从 0 开始的若干字符串。
你可以执行以下操作 任意 次数(包括零次):
- 选择整数
i、j、x和y,满足0 <= i, j < n,0 <= x < words[i].length,0 <= y < words[j].length,交换 字符words[i][x]和words[j][y]。
返回一个整数,表示在执行一些操作后,words 中可以包含的回文字符串的 最大 数量。
注意:在操作过程中,i 和 j 可以相等。
示例 1:
输入:words = ["abbb","ba","aa"] |
示例 2:
输入:words = ["abc","ab"] |
示例 3:
输入:words = ["cd","ef","a"] |
提示:
1 <= words.length <= 10001 <= words[i].length <= 100words[i]仅由小写英文字母组成。
地址
https://leetcode.cn/contest/weekly-contest-384/problems/maximum-palindromes-after-operations/
题意
构造题目 + 贪心
思路
- 题目比较有意思,首先我们看到任意两个字符串中的任意两个字符都可以交换,这其实意味着所有字符串中的所有字符都可以任意交换,包括同一个字符串本身的字符也可以任意交换,题目则转换成了给定不同字符的数目,最多可以构造指定长度的字符串的数目最多为多少。
- 根据 $1$ 的分析我们可以贪心的来构造,首先我们可以知道对于长度为奇数的回文字符串,它最中间的字母可以填任意元素,此时我们只需要计算它的两边需要的成对的字符的数目即可,因此首先我们统计所有出现次数为偶数的字符的数目,然后我们贪心的从字符串长度从小到大开始构造,出现次数为偶数的总数为 $tot$
- 首先构造长度最小的字符串,此时我们从 $tot$ 中减去需要构造的最长偶数对数;
- 然后构造长度较长的字符串,此时我们还是依次构造,直到 $tot$ 小于 $0$ 为止,此时则无法构造。
- 复杂度分析:
- 时间复杂度:$O(n\log n + |\Sigma|)$,其中 $n$ 表示给定字符串数组的长度, $|\Sigma|$ 表示字符集的大小。
- 空间复杂度:$O(|\Sigma|)$, $|\Sigma|$ 表示字符集的大小。
代码
class Solution: |
欢迎关注和打赏,感谢支持!
扫描二维码,分享此文章