LeetCode笔记:Biweekly Contest 95

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题只需要按照题意翻译一下就行了,倒是没啥特殊的地方,直接翻译成代码语言就行了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def categorizeBox(self, length: int, width: int, height: int, mass: int) -> str:
        
        def is_bulky():
            if length >= 10000 or width >= 10000 or height >= 10000:
                return True
            elif length * width * height >= 10**9:
                return True
            return False
        
        def is_heavy():
            return mass >= 100
        
        bulky, heavy = is_bulky(), is_heavy()
        if bulky and heavy:
            return "Both"
        elif bulky:
            return "Bulky"
        elif heavy:
            return "Heavy"
        else:
            return "Neither"

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

2. 题目二

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

1. 解题思路

这一题我的思路就是构建一个计数器,用以维护最后k个数字中出现的元素的个数,要使得判断条件成立,只需要判断这个计数器当中value的计数是否为k即可。

2. 代码实现

给出python代码实现如下:

class DataStream:

    def __init__(self, value: int, k: int):
        self.cnt = defaultdict(int)
        self.k = k
        self.value = value
        self.nums = []

    def consec(self, num: int) -> bool:
        self.nums.append(num)
        self.cnt[num] += 1
        if len(self.nums) > self.k:
            self.cnt[self.nums[-1-self.k]] -= 1
        return self.cnt[self.value] == self.k

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

3. 题目三

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

1. 解题思路

这一题一开始我还搞岔了,以为ijk不能重复,且是有序的,结果后来发现这三个不但可以无序,且还是可以重复选择的,因此,我们只需要统计所有位上面1出现的个数即可。

要使得最终的xor结果为1,我们只需要看全部的组合 n 3 n^3 n3当中出现1的个数是多少就行了,假设全部的 n n n个数当中共有 m m m个数在某一位上为 1 1 1,那么,在全部的 n 3 n^3 n3个组合当中,有效值为 1 1 1的个数就是:

d = m × ( n 2 − ( n − m ) 2 ) d = m \\times (n^2 - (n-m)^2) d=m×(n2(nm)2)

我们只要看 d d d是奇数还是偶数即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def xorBeauty(self, nums: List[int]) -> int:
        N = 32
        def num2digits(num):
            digits = [0 for _ in range(N)]
            idx = N-1
            while num != 0:
                digits[idx] = num % 2
                num = num // 2
                idx -= 1
            return digits
        
        def digits2num(digits):
            res = 0
            for d in digits:
                res = res * 2 + d
            return res
        
        cnt = [0 for _ in range(N)]
        for i, num in enumerate(nums):
            digits = num2digits(num)
            for j, d in enumerate(digits):
                cnt[j] += d
            
        n = len(nums)   
        res = [0 for _ in range(N)]
        for i, d in enumerate(cnt):
            res[i] = (d * (n*n - (n-d)*(n-d))) % 2
        return digits2num(res)

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

4. 题目四

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

1. 解题思路

这一题坦率地说是看了一下大佬们的解答找到的思路,一开始想岔了,后来看了一下之后发现其实还是一个二分法,用二分找到最大的可行值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxPower(self, stations: List[int], r: int, k: int) -> int:
        n = len(stations)
        cumsum = list(accumulate(stations))
        low, high = min(stations), sum(stations) + k+1
        
        def is_valid(tgt):
            extra = []
            power = 0
            cnt = 0
            for i in range(n):
                while extra != [] and i-extra[0][0] > r:
                    power -= extra[0][1]
                    extra.pop(0)
                lo = cumsum[i-r-1] if i-r-1 >= 0 else 0
                hi = cumsum[i+r] if i+r < n else cumsum[-1]
                p = hi-lo + power
                if p < tgt:
                    delta = tgt-p
                    idx = i + r if i+r < n else n-1
                    extra.append((idx, delta))
                    power += delta
                    cnt += delta
                if cnt > k:
                    return False
            return True
                
        while high - low > 1:
            mid = (high + low) // 2
            if is_valid(mid):
                low = mid
            else:
                high = mid
        return low

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

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

LeetCode笔记:Biweekly Contest 79

LeetCode笔记:Biweekly Contest 93

LeetCode笔记:Biweekly Contest 89

LeetCode笔记:Biweekly Contest 69

LeetCode笔记:Biweekly Contest 74

LeetCode笔记:Biweekly Contest 96