LeetCode笔记:Biweekly Contest 86

Posted Espresso Macchiato

tags:

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

0. 赛后总结

好久没有打比赛了,昨天兴致所至重新去打了一下比赛,惊讶地发现我居然还能够拿到国内238,全球777的排名,还是在我最后一题一开始看错题目的前提下,也算是多少有点小开心了。

不过毕竟昨晚的题目简单,后面还需要再接再厉就是了。

1. 题目一

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

1. 解题思路

这一题其实就是考虑所有连续两个元素的和,看看有没有重复就行了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def findSubarrays(self, nums: List[int]) -> bool:
        n = len(nums)
        seen = set()
        for i in range(n-1):
            s = nums[i] + nums[i+1]
            if s in seen:
                return True
            seen.add(s)
        return False

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

2. 题目二

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

1. 解题思路

这一题蛮有意思的,因为想到了那就是直接写答案的东西,想不到就要绕圈子了,还不一定能搞定。

说白了,对于任何一个大于3的数 n n n,考察 n − 2 n-2 n2进制下的结果就一定是 12 12 12,因此必然不可能是严格的回文,故我们只需要直接返回False即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def isStrictlyPalindromic(self, n: int) -> bool:
        return False

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

3. 题目三

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

1. 解题思路

这一题由于 m , n m,n m,n的范围都不会大于12,因此,遍历每一列被block与不被block的情况也就是 2 12 2^12 212种情况,即 4096 4096 4096种情况,更何况cols参数的限制还会帮我们进行一定的剪枝,因此,我们只需要使用一个遍历即可对获得最终的结果。

思路上来说,我们考察每一种符合条件的情况下没有被block的行的数目,然后取出其中的最小值即可反向求得被block的最大值。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumRows(self, mat: List[List[int]], cols: int) -> int:
        n, m = len(mat), len(mat[0])
        cache = defaultdict(set)
        for i in range(n):
            for j in range(m):
                if mat[i][j] == 1:
                    cache[j].add(i)
        
        def dfs(idx, unblock, cnt):
            if idx >= m:
                return n - len(unblock)
            elif cnt == 0:
                return dfs(idx+1, unblock | cache[idx], cnt)
            else:
                return max(
                    dfs(idx+1, unblock | cache[idx], cnt),
                    dfs(idx+1, unblock, cnt-1)
                )
        
        return dfs(0, set(), cols)

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

4. 题目四

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

1. 解题思路

这一题一开始看错题目了,题目上要求是连续的,因此事实上我们只需要维护一个滑动窗口即可。

然后剩下的问题就是怎么快速的得到max(chargeTimes)sum(runningCosts)这两个值,后者可以通过一个累积累积数组快速求得,而前者我们可以维护一个有序数组,然后不断地加入新加入的元素以及弹出超过时间窗口的元素即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumRobots(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int:
        res = 0
        ctimes, rcost, k = [], 0, 0
        for idx, (ct, rc) in enumerate(zip(chargeTimes, runningCosts)):
            bisect.insort(ctimes, ct)
            rcost += rc
            k += 1
            s = ctimes[-1] + k * rcost
            while k > 0 and ctimes[-1] + k * rcost > budget:
                k -= 1
                rct = chargeTimes[idx-k]
                ctimes.pop(bisect.bisect_left(ctimes, rct))
                rcost -= runningCosts[idx-k]
            res = max(res, k)
        return res

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

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

LeetCode笔记:Biweekly Contest 79

LeetCode笔记:Biweekly Contest 93

LeetCode笔记:Biweekly Contest 89

LeetCode笔记:Biweekly Contest 69

LeetCode笔记:Biweekly Contest 74

LeetCode笔记:Biweekly Contest 96