LeetCode 第 67 场双周赛总结

109 阅读1分钟

找到和最大的长度为 K 的子序列

这是我写的:执行用时: 116 ms,内存消耗: 15.2 MB

class Solution:
    def maxSubsequence(self, nums: List[int], k: int) -> List[int]:
        res = nums[:k]
        for i in range(k, len(nums)):
            re = sorted(res)
            if nums[i] > re[0]:
                res.pop(res.index(re[0]))
                res.append(nums[i])
        return res

这是大佬写的:执行用时: 36 ms,内存消耗: 15.3 MB

class Solution:
    def maxSubsequence(self, nums: List[int], k: int) -> List[int]:
        for i in range(len(nums)):
            nums[i] = (nums[i], i)
        nums.sort(key=lambda s: s[0], reverse=True)
        nums = nums[: k]
        nums.sort(key=lambda s: s[1])
        ans = [i[0] for i in nums]
        return ans

我每加一个数都要sort,大佬sort两次就vans了,构造tuple先对值排序再取出前k大的再对index排序,太妙了

适合打劫银行的日子

我交了好多次都超时,太菜了啊啊啊啊啊 在这里插入图片描述 这是大佬写的:执行用时: 244 ms,内存消耗: 32.9 MB

class Solution:
    def goodDaysToRobBank(self, security: List[int], time: int) -> List[int]:
        n = len(security)

        pre = [0 for i in range(n)]
        for i in range(1, n):
            if security[i] <= security[i-1]:
                pre[i] = pre[i-1] + 1
        
        post = [0 for i in range(n)]
        for i in range(n-2, -1, -1):
            if security[i] <= security[i+1]:
                post[i] = post[i+1] + 1
        
        res = []
        for i in range(time, n - time):
            if pre[i] >= time and post[i] >= time:
                res.append(i)
        return res

总的来说就是三次遍历,相当于提前把条件都计算好,最后很容易就比较出来了,我自己是每次都要sort比较,,太菜了太菜了!!!

引爆最多的炸弹

大佬写的:执行用时: 376 ms,内存消耗: 15.6 MB

class Solution:
    def maximumDetonation(self, bombs: List[List[int]]) -> int:
        lenb, d = len(bombs), defaultdict(set)
        for i, j in product(lenb, repeat = 2):
            if math.dist(bombs[i][:2], bombs[j][:2]) <= bombs[i][2]: d[i].append(j)
        for j, k in product(lenb, repeat = 2):
            if k in d[i]:
                d[i] |= d[k]
        return max(len(d[i]) for i in range(lenb))

我实在是太菜了,才知道有product这种好东西,, Python itertools模块中的product函数用于求多个可迭代对象的笛卡尔积(Cartesian Product),它跟嵌套的 for 循环等价。即: product(A, B) 和 ((x,y) for x in A for y in B)一样. 它的一般使用形式如下: product(*iterables, repeat=1) iterables是可迭代对象,repeat指定iterable重复几次,即: product(A,repeat=3)等价于product(A,A,A)

序列顺序查询

大佬写的:执行用时: 648 ms,内存消耗: 37.1 MB

from sortedcontainers import SortedList
class SORTracker:
    def __init__(self):
        self.checkNo = 0
        self.arr = SortedList([])
    
    def add(self, name: str, score: int) -> None:
        self.arr.add((-score, name))

    def get(self) -> str:
        self.checkNo += 1
        return self.arr[self.checkNo-1][1]

我也是才知道SortedList这种好东西,,看来这次双周赛python真的赢麻了hh