LeetCode笔记:Biweekly Contest 80

Posted Espresso Macchiato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Biweekly Contest 80相关的知识,希望对你有一定的参考价值。

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题思路上非常的直接,按照题目要求翻译一下就行了,倒是问题不大。

2. 代码实现

给出python代码实现如下:

class Solution:
    def strongPasswordCheckerII(self, password: str) -> bool:
        if len(password) < 8:
            return False
        if not any(ch in string.ascii_lowercase for ch in password):
            return False
        if not any(ch in string.ascii_uppercase for ch in password):
            return False
        if not any(ch in string.digits for ch in password):
            return False
        if not any(ch in "!@#$%^&*()-+" for ch in password):
            return False
        n = len(password)
        if any(password[i] == password[i+1] for i in range(n-1)):
            return False
        return True

提交代码评测得到:耗时60ms,占用内存13.9MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题就是针对每一个spell找一下potion里面有多少个大于success / spell的元素即可。对potions进行排序之后用一个二分查找即可快速地进行实现。

2. 代码实现

给出python代码实现如下:

class Solution:
    def successfulPairs(self, spells: List[int], potions: List[int], success: int) -> List[int]:
        potions = sorted(potions)
        n = len(potions)
        res = [n - bisect.bisect_left(potions, success / s) for s in spells]
        return res

提交代码评测得到:耗时1640ms,占用内存37.8MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题一开始还想要优化来着,不过想来想去也没想到啥好方法,还引入了不少逻辑漏洞。

最后还是干脆最暴力的直接遍历然后检索了一下,倒是可以搞定,不过耗时有点惨就是了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def matchReplacement(self, s: str, sub: str, mappings: List[List[str]]) -> bool:  
        n, m = len(s), len(sub)
        
        changable = ch for it in mappings for ch in it
        convert = defaultdict(set)
        for k, v in mappings:
            convert[k].add(v)
        
        def is_matched(idx):
            return all(s[idx+i] == sub[i] or s[idx+i] in convert[sub[i]] for i in range(m))
        
        return any(is_matched(idx) for idx in range(n-m+1))

提交代码评测得到:耗时5650ms,占用内存14.3MB。

4. 题目四

给出题目四的试题链接如下:

1. 解题思路

这一题其实非常简单,完全谈不上是hard,因为分数的定义是个数乘以总和,两者都是单调递增的,因此,我们只需要考察每一个元素作为右边界时左边界的下界的位置即可。

显然,这个下界的坐标也是一个单调数组,因此,通过滑动窗口即可对其进行实现。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        accum = [0] + list(accumulate(nums))
        i, j, n = 0, 1, len(nums)
        res = 0
        while j <= n:
            while i < j and (j-i) * (accum[j] - accum[i]) >= k:
                i += 1
            res += j-i
            j += 1
        return res

提交代码评测得到:耗时1797ms,占用内存28.8MB。

以上是关于LeetCode笔记:Biweekly Contest 80的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Biweekly Contest 79

LeetCode笔记:Biweekly Contest 93

LeetCode笔记:Biweekly Contest 89

LeetCode笔记:Biweekly Contest 69

LeetCode笔记:Biweekly Contest 74

LeetCode笔记:Biweekly Contest 96