LeetCode笔记:Biweekly Contest 48 比赛记录

0. 赛后总结

这次的比赛算是马马虎虎吧,国内只是10%左右,世界排名稍微高一点,但是也没挤进前5%,感觉也就一般般,哎……

比较搞笑的是,这次第四题倒是搞定了,但是第三题居然一点点思路都没有,也是奇葩的很,唉……

回头好好看看别人的思路,看看到底别人是怎么在几分钟之内把这题给搞定的吧……

1. 题目一

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

1. 解题思路

这一题倒是没啥问题,只要把字符串中所有的数字全部抽取出来,然后做个排序即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def secondHighest(self, s: str) -> int:
        res = set()
        for c in s:
            if c in "0123456789":
                res.add(int(c))
        res = sorted(res, reverse=True)
        if len(res) > 1:
            return res[1]
        return -1

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

2. 题目二

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

1. 解题思路

第二题就是一个读题的问题,把题目读懂了,这道题就会很快……

这题的核心就是就是对每一个id都需要存储一个验证时间,然后还要记录一下证书的有效时间即可。

之后,就只要按照题意进行三个函数的定义就行了。

2. 代码实现

给出python代码实现如下:

class AuthenticationManager:

    def __init__(self, timeToLive: int):
        self.auth = {}
        self.time = timeToLive

    def generate(self, tokenId: str, currentTime: int) -> None:
        self.auth[tokenId] = currentTime

    def renew(self, tokenId: str, currentTime: int) -> None:
        t = self.auth.get(tokenId, None)
        if t is not None and t <= currentTime < t+self.time:
            self.auth[tokenId] = currentTime

    def countUnexpiredTokens(self, currentTime: int) -> int:
        return len([t for t in self.auth.values() if t <= currentTime < t+self.time])

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

3. 题目三

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

1. 解题思路

惭愧,简直要被我自己蠢哭了,比赛的时候一点思路都没有,然后赛后看了一下别人的解法,发现居然是我自己理解错题目了,硬生生地把一道easy的题目给做成了地狱难度……

感觉自己的语文怕是体育老师教的吧……

核心点在于,题目说的是从0开始连续的,而我理解成了最长的连续数组,也就是说,起点不一定为0,比如[2,2,3,5],就可以组成[3,4,5],但是如果从0开始的话答案就是1,因为除了0之外没法继续往上加……

因此,这道题就可以使用数学归纳法来做,我们首先对coins进行排序。考察第k个硬币面额x,假设之前可以从0一直连续构建到s,且满足 x ≤ s + 1 x \leq s+1 xs+1,那么我们必然可以从0一直连续构建到 s + x s+x s+x,因为当 s < x s < x s<x时,按照原先的构建方法即可,当 s ≥ x s \geq x sx时,我们先取元素x作为基底,那么就只需要按照原先的方法构造0到s即可。

因此,我们在 O ( N ) O(N) O(N)时间复杂度的情况下就可以快速地得到答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def getMaximumConsecutive(self, coins: List[int]) -> int:
        coins = sorted(coins)
        s = 0
        for c in coins:
            if c <= s+1:
                s += c
            else:
                break
        return s+1

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

4. 题目四

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

1. 解题思路

这一题我这边的思路其实是非常暴力的,因为条件 n ≤ 7 n \leq 7 n7,因此,遍历所有情况的计算复杂度至多为:
C 14 2 2 ⋅ C 12 2 2 ⋅ C 10 2 2 ⋅ C 8 2 2 ⋅ C 6 2 2 ⋅ C 4 2 2 ⋅ C 2 2 2 = 5320940 \frac{C_{14}^{2}}{2} \cdot \frac{C_{12}^{2}}{2} \cdot \frac{C_{10}^{2}}{2} \cdot \frac{C_{8}^{2}}{2} \cdot \frac{C_{6}^{2}}{2} \cdot \frac{C_{4}^{2}}{2} \cdot \frac{C_{2}^{2}}{2} = 5320940 2C1422C1222C1022C822C622C422C22=5320940

即时间复杂度在 1 0 6 10^6 106量级,勉强处于可以接受的范围,因此,我们只需要使用一个动态规划算法强行暴力进行实现即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxScore(self, nums: List[int]) -> int:
        n = len(nums)
        cache = []
        for i in range(n-1):
            for j in range(i+1, n):
                cache.append((gcd(nums[i], nums[j]), i, j))
        cache = sorted(cache, reverse=True)
        m = len(cache)
        
        @lru_cache(None)
        def dp(idx, ops, status):
            if ops == 0:
                return 0
            if idx >= m:
                return -math.inf
            res = 0
            for i in range(idx, m):
                g, x, y = cache[i]
                if (1 << x) & status or (1 << y) & status:
                    continue
                res = max(res, ops * g + dp(i+1, ops-1, status ^ (1<<x) ^ (1<<y)))
            return res
        
        return dp(0, n//2, 0)

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值