-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtrapping_rain_water.go
88 lines (80 loc) · 1.69 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
// func trap(height []int) int {
// total := 0
// left := 0
// right := len(height) - 1
// leftMax, rightMax := 0, 0
// for left < right {
// if height[left] <= height[right] {
// if height[left] < leftMax {
// total += leftMax - height[left]
// } else {
// leftMax = height[left]
// }
// left++
// } else {
// if height[right] < rightMax {
// total += rightMax - height[right]
// } else {
// rightMax = height[right]
// }
// right--
// }
// }
// return total
// }
// func min(a, b int) int {
// if a < b {
// return a
// }
// return b
// }
// func max(a, b int) int {
// if a > b {
// return a
// }
// return b
// }
// func trap(height []int) int {
// n := len(height)
// res := 0
// maxFromLeft := make([]int, n)
// maxFromRight := make([]int, n)
// for i := 1; i < n; i++ {
// maxFromLeft[i] = max(maxFromLeft[i-1], height[i-1])
// }
// for j := n - 2; j >= 0; j-- {
// maxFromRight[j] = max(maxFromRight[j+1], height[j+1])
// }
// for i := 1; i < n-1; i++ {
// if height[i] < maxFromLeft[i] && height[i] < maxFromRight[i] {
// res += min(maxFromLeft[i], maxFromRight[i]) - height[i]
// }
// }
// return res
// }
func trap(height []int) int {
maxIdx := 0
for i := 1; i < len(height); i++ {
if height[i] > height[maxIdx] {
maxIdx = i
}
}
currentMax, ans := height[0], 0
for i := 1; i < maxIdx; i++ {
if height[i] > currentMax {
currentMax = height[i]
} else {
ans += currentMax - height[i]
}
}
currentMax = height[len(height)-1]
for i := len(height) - 2; i > maxIdx; i-- {
if height[i] > currentMax {
currentMax = height[i]
} else {
ans += currentMax - height[i]
}
}
return ans
}