leetcode contest biweekly 80
官方难道是手速场,第三题想了半天也没想到什么好办法,直接暴力竟然过了,不知道是什么出题逻辑。
6095. 强密码检验器 II
题目
如果一个密码满足以下所有条件,我们称它是一个 强 密码:
- 它有至少
8个字符。 - 至少包含 一个小写英文 字母。
- 至少包含 一个大写英文 字母。
- 至少包含 一个数字 。
- 至少包含 一个特殊字符 。特殊字符为:
"!@#$%^&*()-+"中的一个。 - 它 不 包含
2个连续相同的字符(比方说"aab"不符合该条件,但是"aba"符合该条件)。
给你一个字符串password,如果它是一个 强 密码,返回true,否则返回false。
示例 1:
输入:password = "IloveLe3tcode!" |
示例 2:
输入:password = "Me+You--IsMyDream" |
示例 3:
输入:password = "1aB!" |
提示:
1 <= password.length <= 100password包含字母,数字和"!@#$%^&*()-+"这些特殊字符。
地址
https://leetcode.cn/contest/biweekly-contest-80/problems/strong-password-checker-ii/
题意
直接模拟
思路
- 按照题目逻辑模拟即可。
- 复杂度分析:
- 时间复杂度:$O(n)$, 其中 $n$ 为字符串的长度。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6096. 咒语和药水的成功对数
题目
给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。
同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。
请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。
示例 1:
输入:spells = [5,1,3], potions = [1,2,3,4,5], success = 7 |
示例 2:
输入:spells = [3,1,2], potions = [8,5,8], success = 16 |
提示:
n == spells.lengthm == potions.length1 <= n, m <= 1051 <= spells[i], potions[i] <= 1051 <= success <= 1010
地址
https://leetcode.cn/contest/biweekly-contest-80/problems/successful-pairs-of-spells-and-potions/
题意
二分查找
思路
- 直接对
potions进行排序,每次遍历 $\textit{spells}[i]$, 找到 $\textit{potions}$ 中所有大于等于 $\lceil \dfrac{success}{spells} \rceil$ 的数目即可,我们可以用二分查找完成即可 。 - 复杂度分析:
- 时间复杂度:$O((m + n) \times \log n)$,其中 $m$ 为数组 $\textit{spells}$ 的长度,其中 $n$ 为数组 $\textit{potions}$ 的长度。
- 空间复杂度:$O(1)$。
代码
class Solution { |
6097. 替换字符后匹配
题目
给你两个字符串 s 和 sub 。同时给你一个二维字符数组 mappings ,其中 mappings[i] = [oldi, newi] 表示你可以替换 sub 中任意数目的 oldi 个字符,替换成 newi 。sub 中每个字符 不能 被替换超过一次。
如果使用 mappings 替换 0 个或者若干个字符,可以将 sub 变成 s 的一个子字符串,请你返回 true,否则返回 false 。
一个 子字符串 是字符串中连续非空的字符序列。
示例 1:
输入:s = "fool3e7bar", sub = "leet", mappings = [["e","3"],["t","7"],["t","8"]] |
示例 2:
输入:s = "fooleetbar", sub = "f00l", mappings = [["o","0"]] |
示例 3:
输入:s = "Fool33tbaR", sub = "leetd", mappings = [["e","3"],["t","7"],["t","8"],["d","b"],["p","b"]] |
提示:
1 <= sub.length <= s.length <= 50000 <= mappings.length <= 1000mappings[i].length == 2oldi != newis和sub只包含大写和小写英文字母和数字。oldi和newi是大写、小写字母或者是个数字。
地址
https://leetcode.cn/contest/biweekly-contest-80/problems/match-substring-after-replacement/
题意
暴力循环
思路
- 想了半天没有想到这个题目有什么好的解法,只能每次遍历所有可能的组合,遍历两个字符串中所有的组合,找到组合中的不同的字符变换,查找该字符映射是否能够完成即可,反正莫名其妙就过了,感觉解法应该不对,时间复杂度应该不需要这么高。
- 复杂度分析:
- 时间复杂度:$O(m \times n)$, 其中 $m,n$ 为字符串 $s, \textit{sub}$ 的长度。
- 空间复杂度:$O(k)$,其中 $k$ 为 $\textit{mappings}$ 的长度。
代码
class Solution { |
6098. 统计得分小于 K 的子数组数目
题目
一个数字的 分数 定义为数组之和 乘以 数组的长度。
- 比方说,
[1, 2, 3, 4, 5]的分数为(1 + 2 + 3 + 4 + 5) * 5 = 75。
给你一个正整数数组nums和一个整数k,请你返回nums中分数 严格小于k的 非空整数子数组数目。
子数组 是数组中的一个连续元素序列。
示例 1:
输入:nums = [2,1,4,3,5], k = 10 |
示例 2:
输入:nums = [1,1,1], k = 5 |
提示:
1 <= nums.length <= 1051 <= nums[i] <= 1051 <= k <= 1015
地址
https://leetcode.cn/contest/biweekly-contest-80/problems/count-subarrays-with-score-less-than-k/
题意
二分查找
思路
- 这个题目感觉只能算是中等难度题目,不晓得为啥是
hard级别。我们可以每次枚举以 $nums[i]$ 为结尾的子数组所有构成的最长符合要求的子数组。我们用二分查找枚举子数组的起点 $j$,我们可以知道如果当 $(i - j + 1) * (sum[i] - sum[j - 1]) \ge k$ 时,此时则我们应当增加 $j$, 否则减少 $j$。知道我们找到最大的 $j$ 即可,此时满足要求的子数组一共有 $i - j + 1$ 个,我们依次求出符合满足每个元素构成的子数组的数目,然后累加即可。 - 复杂度分析:
- 时间复杂度:$n \log n$,其中 $n$ 表示数组的长度。每次枚举时需要进行二分查找。
- 空间复杂度:$O(n)$, 其中 $n$ 表示数组的长度。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://mikemeng.org/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿

扫描二维码,分享此文章