未参加的比赛,感觉leetcode的比赛确实越来越难了
第二题 保证文件名唯一
一道有意思的题目,要求对相同名字的文件添加序号。
我们需要考虑减小复杂度,也就是每次遇到重复的文件名时候,需要维护一个字典去存储该文件名已经命名到了哪个序列。
class Solution:
def getFolderNames(self, names: List[str]) -> List[str]:
if not names:
return []
# 存储每个文件名字,对应的序号
dic = collections.defaultdict(int)
has = set()
ans = []
for i in names:
# 不是新的文件名
if i in has:
k = dic[i]
cur = i+"("+ str(k)+')'
while cur in has:
k += 1
cur = i+"("+ str(k)+')'
dic[i] = k
# 是新的文件名
else:
cur = i
# 每次都会产生一个新的文件名族,和添加新的文件
dic[cur] = 1
ans.append(cur)
has.add(cur)
return ans
第三题 避免洪水泛滥
也是一道合理设计结构的题目,有一点类似贪心的思路。比较巧妙之处在于理解题意,题目给出了要求,不让洪水泛滥,因此我们在每天抽干时候,可以选择最紧急的一个。
因此我们要找到每个湖泊对应的下一天下雨的时间,这里采用倒叙遍历的方法,用字典每次更新下每个湖泊下雨的日子,数组存储了当天的湖泊,在哪一天赢来下一次下雨。
之后我们借助一个最小堆,每次遇到不下雨的时候,从最小堆中选取最紧急的抽水即可。
class Solution:
def avoidFlood(self, rains: List[int]) -> List[int]:
has = set()
ans = []
n = len(rains)
next = [n+1]*n
cur = {}
search = []
heapq.heapify(search)
for i in range(n-1,-1,-1):
if rains[i]:
if rains[i] in cur:
next[i] = cur[rains[i]]
cur[rains[i]] = i
print(next)
for i in range(n):
if rains[i] != 0:
if rains[i] in has:
return []
ans.append(-1)
heapq.heappush(search, (next[i], rains[i]))
has.add(rains[i])
else:
if search:
_, cur = heapq.heappop(search)
ans.append(cur)
has.remove(cur)
else:
ans.append(1)
return ans