1 leetcode每日一题
看题解。emm有点绕,主要就是从前往后一步步处理,遇到下雨天,就返回头看看有没有晴天能抽水,维护一个可抽水日期表、一个各个湖泊的下雨情况表,实时更新答案表。
from sortedcontainers import SortedList
class Solution:
def avoidFlood(self, rains: List[int]) -> List[int]:
ans = [1] * len(rains)
st = SortedList() # 存放晴朗天数的有序列表
mp= {} # 字典,存放各个下雨湖泊信息{湖泊号:最后一次下雨日期}
for i, rain in enumerate(rains):
if rain == 0:
st.add(i) # 如果是晴天,在st中加入该天
else:
ans[i] = -1 # 若是雨天,不能抽水,ans中该天为-1
# 如果这个湖泊已经下过一次雨【危!】
if rain in mp:
it = st.bisect(mp[rain]) # 二分查找,将该湖泊上次下雨的日期mp[rain]在晴朗日子中查找,得到插入后的序号it
if it == len(st):
return [] # 如果插入后mp[rain]排在最后,说明该湖泊在上次下雨后,已没有可以抽水的晴朗日子,会发生洪水
ans[st[it]] = rain # 否则,则将ans中it对应的晴朗日子,作为抽干该湖泊的日子
st.discard(st[it]) # 改天已抽水,从st中删除
mp[rain] = i # 更新湖泊信息
return ans