Untitled

 avatar
unknown
plain_text
2 months ago
1.5 kB
3
Indexable
class Solution {
    public int minTaps(int n, int[] ranges) {
        // First convert ranges to maximum reach array, just like jump lengths
        int[] maxReach = new int[n + 1];
        for (int i = 0; i <= n; i++) {
            int start = Math.max(0, i - ranges[i]);
            int end = Math.min(n, i + ranges[i]);
            maxReach[start] = Math.max(maxReach[start], end);
        }

        // Now use identical structure to Jump Game II
        int taps = 0;          // counts minimum taps needed, like jumps
        int i = 0;            // start of current level
        int j = 0;            // end of current level (replacing currentEnd)
        
        while (j < n) {       // while we haven't covered the whole garden
            int maxRange = 0;  // tracks furthest reach from current level
            
            // Explore all positions in current level
            for (int index = i; index <= j; index++) {
                maxRange = Math.max(maxRange, maxReach[index]);
            }
            
            // If we can't extend our reach, garden can't be watered
            if (maxRange <= j) {
                return -1;
            }
            
            // Move to next level
            i = j + 1;        // new level starts after current end
            j = maxRange;     // new level ends at our maximum reach
            taps++;
        }
        
        return taps;
    }
}
Editor is loading...
Leave a Comment