-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtrapping-rain-water.go
67 lines (63 loc) · 1.1 KB
/
trapping-rain-water.go
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
58
59
60
61
62
63
64
65
66
67
package main
import "fmt"
func fill(height []int, left, right int) int {
if left >= right {
return 0
}
watermark := height[left]
if height[left] > height[right] {
watermark = height[right]
}
count := 0
for i := left + 1; i <= right-1; i++ {
if height[i] < watermark {
count += watermark - height[i]
height[i] = watermark
}
}
return count
}
func trap(height []int) int {
if len(height) <= 2 {
return 0
}
count := 0
for {
changed := false
left := -1
right := -1
for i := 1; i < len(height)-1; i++ {
if height[i] < height[i-1] {
if left != -1 && right != -1 {
filled := fill(height, left, right)
if filled > 0 {
count += filled
changed = true
}
left = -1
right = -1
}
if left == -1 {
left = i - 1
}
}
if height[i] < height[i+1] {
right = i + 1
}
}
if left != -1 && right != -1 {
filled := fill(height, left, right)
if filled > 0 {
count += filled
changed = true
}
}
if !changed {
break
}
}
return count
}
func main() {
fmt.Println(trap([]int{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}))
}