-
Notifications
You must be signed in to change notification settings - Fork 0
/
42_trapping_rain_water.js
64 lines (59 loc) · 1.5 KB
/
42_trapping_rain_water.js
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
// tags: #two-pointers
// https://leetcode.cn/problems/trapping-rain-water/
// version 1
// time: O(n^2) | 3092ms
// space: O(n)
var trap = function (height) {
let water = 0;
for (let i = 0; i < height.length; i++) {
water += Math.max(
Math.min(
Math.max(...height.slice(0, i)),
Math.max(...height.slice(i + 1, height.length))
) - height[i],
0
);
}
return water;
};
// version 2
// 优化上一个版本的最大值搜索
// time: O(n) | 132ms
// space: O(n)
var trap = function (height) {
let water = (leftMax = rightMax = 0);
const leftMaxArr = [];
const rightMaxArr = [];
for (let i = 0; i < height.length; i++) {
leftMax = Math.max(leftMax, height[i]);
leftMaxArr.push(leftMax);
}
for (let i = height.length - 1; i >= 0; i--) {
rightMax = Math.max(rightMax, height[i]);
rightMaxArr.unshift(rightMax);
}
for (let i = 0; i < height.length; i++) {
water += Math.max(Math.min(leftMaxArr[i], rightMaxArr[i]) - height[i], 0);
}
return water;
};
// version 3
// time: O(n) | 64ms | beat 88%
// space: O(1)
var trap = function (height) {
let water = 0;
let left = 0;
let right = height.length - 1;
let leftMax = height[left];
let rightMax = height[right];
while (left <= right) {
if (leftMax <= rightMax) {
water += leftMax - height[left];
leftMax = Math.max(leftMax, height[++left]);
} else {
water += rightMax - height[right];
rightMax = Math.max(rightMax, height[--right]);
}
}
return water;
};