【算法】力扣第 282 场周赛(最短代码)

6008. 统计包含给定前缀的字符串

API题,一行

class Solution:
    def prefixCount(self, words: List[str], pref: str) -> int:
        return sum(w.startswith(pref) for w in words)

6009. 使两字符串互为字母异位词的最少步骤数

①哈希,二行

class Solution:
    def minSteps(self, s: str, t: str) -> int:
        cnt1,cnt2=Counter(s),Counter(t)
        return sum(abs(cnt1[x]-cnt2[x]) for x in set(s+t))

②并集减去交集,二行

class Solution:
    def minSteps(self, s: str, t: str) -> int:
        cs,ct = Counter(s),Counter(t)
        return sum(((cs | ct) - (cs & ct)).values())  

6010. 完成旅途的最少时间

二分,注意溢出,五行代码

class Solution:
    def minimumTime(self, time: List[int], totalTrips: int) -> int:
        l, r = 1, 10 ** 16
        while l < r:
            m = (l + r) // 2
            l,r = (l,m) if sum(m//t for t in time)>=totalTrips else (m+1,r)
        return l

灵茶山大佬的一行解法,奇妙的带key二分(python3.10支持)!

class Solution:
    def minimumTime(self, time: List[int], totalTrips: int) -> int:
        return bisect_left(range(totalTrips * min(time)), totalTrips, key=lambda x: sum(x // t for t in time))

6011. 完成比赛的最少时间

这题可可没能解决,在参考了灵茶山大佬的的题解后整理成了下面的八行代码:?

class Solution:
    def minimumFinishTime(self, tires: List[List[int]], t: int, n: int) -> int:
        min_sec = [float('inf')] * 18
        for f, r in tires:
            x, time, sum = 1, f, 0
            while time <= t + f:sum,min_sec[x],time,x = sum+time,min(min_sec[x], sum+time),time*r,x+1
        f = [-t]+[0] * (n + 1)
        for i in range(1, n + 1):
            f[i] = t + min(f[i - j] + min_sec[j] for j in range(1, min(18, i + 1)))
        return f[n]

总结

T1+T2+T3+T4 一共 1+2+1+8=12行代码,完成【20行完成周赛】的目标!

此外,可可也了解到python3.10有许多好用的新特性,这将是可可下一周的学习目标!


版权声明:本文为weixin_45825073原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。