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号