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 x≤s+1,那么我们必然可以从0一直连续构建到 s + x s+x s+x,因为当 s < x s < x s<x时,按照原先的构建方法即可,当 s ≥ x s \geq x s≥x时,我们先取元素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
n≤7,因此,遍历所有情况的计算复杂度至多为:
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
2C142⋅2C122⋅2C102⋅2C82⋅2C62⋅2C42⋅2C22=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。