-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path42-water-trap.js
124 lines (111 loc) · 2.65 KB
/
42-water-trap.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
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
113
114
115
116
117
118
119
120
121
122
123
import BIG from './test-42.js';
var trap = newTrap;
function newTrap(height) {
let total = 0;
// create maxes
const maxLeft = [];
const maxRight = new Array(height.length);
let maxL = 0;
let maxR = 0;
height.forEach(val => {
if ( val > maxL ) {
maxL = val;
}
maxLeft.push(maxL);
});
for( let i = height.length - 1; i >= 0; i-- ) {
const val = height[i];
if ( val > maxR ) {
maxR = val;
}
maxRight[i] = maxR;
}
console.log(maxLeft, maxRight);
height.forEach((val, index) => {
maxL = maxLeft[index];
maxR = maxRight[index];
total += (Math.min(maxL, maxR) - val);
});
return total;
}
function originalTrap(height) {
let total = 0;
let lastFirst1 = 0, lastLast1 = height.length - 1;
//const max = Math.max(...height);
let low = Math.min(...height);
let high = low+1;
while(true) {
const {first1,last1,filteredPeaks} = filter(low, high, height, 0, height.length-1, /*lastFirst1, lastLast1*/);
if ( first1 === last1 ) break;
lastFirst1 = first1;
lastLast1 = last1;
//const intervals = findIntervals(filteredPeaks, first1, last1);
const sum = sumIntervals(filteredPeaks, first1, last1);
total += sum;
/*
if ( intervals.length ) {
for( const [left, right] of intervals ) {
total += (right - left) - 1;
}
}
*/
low++;
high++;
}
return total;
};
const T = [
/*
trap([0,1,0,2,1,0,1,3,2,1,2,1]),
trap([4,2,0,3,2,5]),
trap([0,7,1,4,6]),
*/
trap(BIG)
];
console.log(T);
function filter(low, high, arr, lastFirst1, lastLast1) {
let first1 = -1, last1 = -1;
const filteredPeaks = [];
for ( let i = lastFirst1; i <= lastLast1; i++ ) {
const v = arr[i];
if ( v <= low ) filteredPeaks.push(0);
if ( v >= high ) {
if ( first1 === -1 ) first1 = i;
last1 = i;
filteredPeaks.push(1);
}
}
return {filteredPeaks, first1, last1};
}
function findIntervals(peaks, intervalStart, last) {
const intervals = [];
if ( intervalStart === -1 ) {
return intervals;
}
for( let i = intervalStart+1; i <= last; i++ ) {
const val = peaks[i];
if ( val === 1 ) {
if ( (i - intervalStart) > 1 ) {
intervals.push([intervalStart, i]);
}
intervalStart = i;
}
}
return intervals;
}
function sumIntervals(peaks, intervalStart, last) {
let sum = 0;
if ( intervalStart === -1 ) {
return sum;
}
for( let i = intervalStart+1; i <= last; i++ ) {
const val = peaks[i];
if ( val === 1 ) {
if ( (i - intervalStart) > 1 ) {
sum += (i - intervalStart) - 1;
}
intervalStart = i;
}
}
return sum;
}