1326. 灌溉花园的最少水龙头数目
在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。
花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ..., n] 。
给你一个整数 n 和一个长度为 n + 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始)表示:如果打开点 i 处的水龙头,可以灌溉的区域为 [i - ranges[i], i + ranges[i]] 。
请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-taps-to-open-to-water-a-garden
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
枚举区间
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
class Solution {
    public int minTaps(int n, int[] ranges) {
        if (ranges == null || ranges.length == 0) {
            return -1;
        }
        Info[] infos = new Info[ranges.length];
        for (int i = 0; i < ranges.length; ++i) {
            infos[i] = new Info(Integer.max(0, i - ranges[i]), Integer.min(n, i + ranges[i]));
        }
        Arrays.sort(infos, new Comparator<Info>() {
            @Override
            public int compare(Info o1, Info o2) {
                return Integer.compare(o1.left, o2.left);
            }
        });
        int ans = 0;
        int curMax = -1, nextMax = 0;
        for (int i = 0; i < infos.length; ++i) {
            if (infos[i].left > curMax) {
                if (infos[i].left > nextMax) {
                    return -1;
                }
                ans++;
                curMax = nextMax;
            }
            nextMax = Math.max(nextMax, infos[i].right);
            if (nextMax >= n) {
                return ans;
            }
        }
        return -1;
    }
}
class Info {
    int left;
    int right;
    public Info(int left, int right) {
        this.left = left;
        this.right = right;
    }
}
枚举端点
class Solution {
    public int minTaps(int n, int[] ranges) {
        int[] endpoints = new int[n + 1];
        for (int i = 0; i < ranges.length; ++i) {
            int left = Math.min(n, Math.max(0, i - ranges[i]));
            int right = Math.max(0, Math.min(n, i + ranges[i]));
            endpoints[left] = Math.max(endpoints[left], right);
        }
        int ans = 0;
        int curMax = -1, nextMax = 0;
        for (int i = 0; i < endpoints.length; ++i) {
            if (i > curMax) {
                if (nextMax < i) {
                    return -1;
                }
                ans++;
                curMax = nextMax;
            }
            nextMax = Math.max(nextMax, endpoints[i]);
            if (nextMax == n) {
                return ans;
            }
        }
        return -1;
    }
}
    心之所向,素履以往 生如逆旅,一苇以航

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号