-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path407_trapping_rain_water_ii.rb
57 lines (44 loc) · 2.07 KB
/
407_trapping_rain_water_ii.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# frozen_string_literal: true
# https://leetcode.com/problems/trapping-rain-water-ii/
# @param {Integer[][]} height_map
# @return {Integer}
def trap_rain_water(height_map)
trapped_water = 0
water_level_map = ::Array.new(height_map.size) { ::Array.new(height_map[0].size, 20_000) }
(1...height_map.size - 1).each do |i|
water_level_map[i][0] = height_map[i][0]
(1...height_map[i].size - 1).each { |j| water_level_map[i][j] = 20_000 }
water_level_map[i][height_map[i].size - 1] = height_map[i][height_map[i].size - 1]
end
(0...height_map[0].size).each do |i|
water_level_map[0][i] = height_map[0][i]
water_level_map[height_map.size - 1][i] = height_map[height_map.size - 1][i]
end
drain = true
while drain
drain = false
(1...height_map[0].size - 1).each do |i|
(1...height_map.size - 1).each do |j|
next unless water_level_map[j][i] > height_map[j][i]
water_level_map[j][i] = [water_level_map[j][i - 1], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j][i - 1]
water_level_map[j][i] = [water_level_map[j - 1][i], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j - 1][i]
end
end
(height_map[0].size - 2).downto(1) do |i|
(height_map.size - 2).downto(1) do |j|
next unless water_level_map[j][i] > height_map[j][i]
water_level_map[j][i] = [water_level_map[j][i + 1], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j][i + 1]
water_level_map[j][i] = [water_level_map[j + 1][i], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j + 1][i]
next unless water_level_map[j][i] < water_level_map[j][i + 1] && water_level_map[j][i + 1] > height_map[j][i + 1] ||
water_level_map[j][i] < water_level_map[j + 1][i] && water_level_map[j + 1][i] > height_map[j + 1][i]
drain = true
end
end
end
(1...water_level_map.size - 1).each do |i|
(1...water_level_map[i].size - 1).each do |j|
trapped_water += water_level_map[i][j] - height_map[i][j]
end
end
trapped_water
end