Back to all solutions
#1326 - Minimum Number of Taps to Open to Water a Garden
Problem Description
There is a one-dimensional garden on the x-axis. The garden starts at the point 0 and ends at the point n. (i.e., the length of the garden is n).
There are n + 1 taps located at points [0, 1, ..., n] in the garden.
Given an integer n and an integer array ranges of length n + 1 where ranges[i] (0-indexed) means the i-th tap can water the area [i - ranges[i], i + ranges[i]] if it was open.
Return the minimum number of taps that should be open to water the whole garden, If the garden cannot be watered return -1.
Solution
/**
* @param {number} n
* @param {number[]} ranges
* @return {number}
*/
var minTaps = function(n, ranges) {
const intervals = ranges.map((range, index) => [
Math.max(0, index - range),
Math.min(n, index + range)
]);
intervals.sort((a, b) => a[0] - b[0] || b[1] - a[1]);
let taps = 0;
let currentEnd = 0;
let nextEnd = 0;
let i = 0;
while (i < intervals.length && currentEnd < n) {
taps++;
while (i < intervals.length && intervals[i][0] <= currentEnd) {
nextEnd = Math.max(nextEnd, intervals[i][1]);
i++;
}
if (currentEnd === nextEnd) return -1;
currentEnd = nextEnd;
}
return currentEnd >= n ? taps : -1;
};