第 309 场周赛 总结
检查相同字母间的距离
标记每次出现的字母所出现的位置,进行判断即可
class Solution:
def checkDistances(self, s: str, distance: List[int]) -> bool:
vis = [0] * 26
for step, ss in enumerate(s):
ss = ord(ss) - ord('a')
if vis[ss] and step - vis[ss] != distance[ss]:
return False
vis[ss] = step + 1
return True
恰好移动 k 步到达某一位置的方法数目
第一眼看上去有点复杂,但想想用记忆化搜索即可解决
dfs中注意要对结果取余
class Solution:
def numberOfWays(self, startPos: int, endPos: int, k: int) -> int:
Mo = 1e9+7
@cache
def dfs(n, k):
if abs(n) > k:
return 0
if k == 0:
return n == 0
return (dfs(n-1, k-1) + dfs(n+1, k-1)) % Mo
return int(dfs(endPos-startPos, k))
python 可以直接用装饰器实现记忆化还真挺方便的
最长优雅子数组
又看错题目了,原来说的是子数组,还以为是子序列就直接放弃了
子数组的话直接使用滚动窗口解决
class Solution:
def longestNiceSubarray(self, nums: List[int]) -> int:
left,mask,res = 0,0,0
for right, num in enumerate(nums):
while mask & num > 0:
mask ^= nums[left]
left += 1
mask ^= num
res = max(res, right-left+1)
return res
会议室 III
题目还挺长的,不过仔细阅读一下就理解了
感觉以前做过类似的题目,那时候用一个堆来维护
这里使用两个堆,一个维护空闲会议室,一个维护使用中的会议室
class Solution:
def mostBooked(self, n: int, meetings: List[List[int]]) -> int:
vis = [0] * n
rest, use = list(range(n)), []
meetings=sorted(meetings,key=lambda x: x[0])
for start, end in meetings:
while use and use[0][0] <= start:
heappush(rest, heappop(use)[1])
if rest:
pos = heappop(rest)
else:
temp, pos = heappop(use)
end += temp - start
vis[pos] += 1
heappush(use, (end, pos))
res = 0
for pos, r in enumerate(vis):
if r > vis[res]:
res = pos
return res
总结
orz