1488. 避免洪水泛滥

Medium

思路

周赛没有解出来,拜读大佬思想获取思路

为什么要用上一次这个湖下雨后的第一个晴天来抽取?

012012 对于这个实例来说,第二个1时发现需要抽水,有两个晴天但是不是每一个晴天都是可用的。第一个01之前,所以抽了对1没有什么影响,所以选需要选择上一次下雨之后的晴天来使用。假如下雨之后有多个晴天可以使用,通过贪心的思想,我们就使用最近的一个晴天。因为后面的日子选择的余地肯定比刚发生的是要多的。需要细品。

尝试写一下代码,AC!

代码

python3

class Solution:
  def search(self,target,suns):
      i = 0
      j = len(suns) - 1
      while i < j:
        mid = i + (j - i) // 2
        if suns[mid] <= target:
          i = mid + 1
        else:
          j = mid
      return suns[i], i

  def avoidFlood(self, rains: List[int]) -> List[int]:
    suns = [] #保存晴天的日子
    record = {} #下雨的日子,有两个内容要保存:湖泊编号,日子。用dict减少查询复杂度
    res = [1 for _ in range(len(rains))]
    for i,rain in enumerate(rains):
      if rain is 0:
        suns.append(i) #记录晴天的日子
      else:
        res[i] = -1
        if rain not in record:
          record[rain] = i #之前没有下过雨
        else:
          start = record[rain] #上次下雨的日子
          if len(suns) is 0:
            return []
          s,k = self.search(start,suns) #搜索上次下雨最近一个晴天
          if s >= i or s <= start:
            return []
          record[rain] = i #更新记录
          res[s] = rain
          del suns[k]
    return res