-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0042.go
112 lines (93 loc) · 2.44 KB
/
0042.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Source: https://leetcode.com/problems/trapping-rain-water
// Title: Trapping Rain Water
// Difficulty: Hard
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.
//
// Example 1:
//
// https://assets.leetcode.com/uploads/2018/10/22/rainwatertrap.png
// Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]
// Output: 6
// Explanation: The above elevation map (black section) is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
//
// Example 2:
//
// Input: height = [4,2,0,3,2,5]
// Output: 9
//
// Constraints:
//
// n == height.length
// 1 <= n <= 2 * 10^4
// 0 <= height[i] <= 10^5
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package main
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Use two pointers
func trap(height []int) int {
n := len(height)
if n == 1 {
return 0
}
i := 0 // left index
j := n - 1 // right index
res := 0
waterLevel := 0
for i < j {
var currVal int
if height[i] <= height[j] {
currVal = height[i]
i++
} else {
currVal = height[j]
j--
}
if currVal > waterLevel {
waterLevel = currVal
} else {
res += waterLevel - currVal
}
}
return res
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Use two arrays
func trap2(height []int) int {
n := len(height)
if n == 1 {
return 0
}
leftLevel := make([]int, n)
rightLevel := make([]int, n)
currMax := 0
for i := 0; i < n; i++ {
currMax = _max(currMax, height[i])
leftLevel[i] = currMax
}
currMax = 0
for i := n - 1; i >= 0; i-- {
currMax = _max(currMax, height[i])
rightLevel[i] = currMax
}
res := 0
for i := 0; i < n; i++ {
res += _min(leftLevel[i], rightLevel[i]) - height[i]
}
return res
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
func _max(a, b int) int {
if a > b {
return a
}
return b
}
func _min(a, b int) int {
if a < b {
return a
}
return b
}