Minimum Number of Taps to Open to Water a Garden LeetCode solution in JavaScript

1
var minTaps = function (n, ranges) {
2
let intervals = [];
3
for (let i = 0; i < ranges.length; i++) {
4
let l = i - ranges[i];
5
let r = i + ranges[i];
6
intervals.push([l, r]);
7
}
8

9
intervals.sort((a, b) => {
10
if (a[0] === b[0]) return b[1] - a[1];
11
return a[0] - b[0];
12
});
13

14
// Find the starting idx
15
let startIdx;
16
for (let i = 0; i < intervals.length; i++) {
17
let [s, e] = intervals[i];
18
if (s <= 0) {
19
if (startIdx === undefined) startIdx = i;
20
else if (intervals[startIdx][1] < e) startIdx = i;
21
} else break;
22
}
23
if (startIdx === undefined) return -1;
24

25
let q = [startIdx],
26
openedTaps = 1;
27
while (q.length) {
28
let max;
29
while (q.length) {
30
let idx = q.pop();
31
let [start, end] = intervals[idx];
32
if (end >= n) return openedTaps;
33
for (let i = idx + 1; i < intervals.length; i++) {
34
let [nextStart, nextEnd] = intervals[i];
35
// If next interval's start is less than the current interval's end
36
if (nextStart <= end) {
37
if (!max && nextEnd > end) max = { i, end: nextEnd };
38
// If the next interval's end is greater than the current interval's end
39
else if (max && nextEnd > max.end) max = { i, end: nextEnd };
40
} else break;
41
}
42
}
43
if (max) {
44
q.push(max.i);
45
openedTaps++;
46
}
47
}
48

49
return -1;
50
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0