【leetcode】1488. Avoid Flood in The City
题目如下:
Your country has an infinite number of lakes. Initially, all the lakes are empty, but when it rains over the
nthlake, thenthlake becomes full of water. If it rains over a lake which is full of water, there will be a flood. Your goal is to avoid the flood in any lake.Given an integer array
rainswhere:
rains[i] > 0means there will be rains over therains[i]lake.rains[i] == 0means there are no rains this day and you can choose one lake this day and dry it.Return an array
answhere:
ans.length == rains.lengthans[i] == -1ifrains[i] > 0.ans[i]is the lake you choose to dry in theithday ifrains[i] == 0.If there are multiple valid answers return any of them. If it is impossible to avoid flood return an empty array.
Notice that if you chose to dry a full lake, it becomes empty, but if you chose to dry an empty lake, nothing changes. (see example 4)
Example 1:
Input: rains = [1,2,3,4] Output: [-1,-1,-1,-1] Explanation: After the first day full lakes are [1] After the second day full lakes are [1,2] After the third day full lakes are [1,2,3] After the fourth day full lakes are [1,2,3,4] There's no day to dry any lake and there is no flood in any lake.Example 2:
Input: rains = [1,2,0,0,2,1] Output: [-1,-1,2,1,-1,-1] Explanation: After the first day full lakes are [1] After the second day full lakes are [1,2] After the third day, we dry lake 2. Full lakes are [1] After the fourth day, we dry lake 1. There is no full lakes. After the fifth day, full lakes are [2]. After the sixth day, full lakes are [1,2]. It is easy that this scenario is flood-free. [-1,-1,1,2,-1,-1] is another acceptable scenario.Example 3:
Input: rains = [1,2,0,1,2] Output: [] Explanation: After the second day, full lakes are [1,2]. We have to dry one lake in the third day. After that, it will rain over lakes [1,2]. It's easy to prove that no matter which lake you choose to dry in the 3rd day,
the other one will flood.Example 4:
Input: rains = [69,0,0,0,69] Output: [-1,69,1,1,-1] Explanation: Any solution on one of the forms [-1,69,x,y,-1], [-1,x,69,y,-1] or [-1,x,y,69,-1] is acceptable where 1 <= x,y <= 10^9Example 5:
Input: rains = [10,20,20] Output: [] Explanation: It will rain over lake 20 two consecutive days. There is no chance to dry any lake.Constraints:
1 <= rains.length <= 10^50 <= rains[i] <= 10^9
解题思路:遍历rains,保存每个0出现的日期,同时记录已经灌满水的湖的下标以及对应的日期。遇到雨天时,先判断下雨的湖是否已满。如果已满,则根据之前灌满水的日期,找出离其最接近的后面的排水日期做排水操作即可。如果找不到,则返回[]。
代码如下:
class Solution(object): def avoidFlood(self, rains): """ :type rains: List[int] :rtype: List[int] """ import bisect dry = [] res = [-1] * len(rains) full = {} for i in range(len(rains)): if rains[i] == 0: dry.append(i) continue elif rains[i] not in full: full[rains[i]] = i continue elif len(dry) == 0: return [] inx = bisect.bisect_left(dry,full[rains[i]]) if inx == len(dry) :return [] res[dry.pop(inx)] = rains[i] full[rains[i]] = i for i in dry: res[i] = 1 return res
浙公网安备 33010602011771号