|
|
|
|
package class52;
|
|
|
|
|
|
|
|
|
|
public class Problem_0683_KEmptySlots {
|
|
|
|
|
|
|
|
|
|
public static int kEmptySlots1(int[] bulbs, int k) {
|
|
|
|
|
int n = bulbs.length;
|
|
|
|
|
int[] days = new int[n];
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
days[bulbs[i] - 1] = i + 1;
|
|
|
|
|
}
|
|
|
|
|
int ans = Integer.MAX_VALUE;
|
|
|
|
|
if (k == 0) {
|
|
|
|
|
for (int i = 1; i < n; i++) {
|
|
|
|
|
ans = Math.min(ans, Math.max(days[i - 1], days[i]));
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
int[] minq = new int[n];
|
|
|
|
|
int l = 0;
|
|
|
|
|
int r = -1;
|
|
|
|
|
for (int i = 1; i < n && i < k; i++) {
|
|
|
|
|
while (l <= r && days[minq[r]] >= days[i]) {
|
|
|
|
|
r--;
|
|
|
|
|
}
|
|
|
|
|
minq[++r] = i;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 1, j = k; j < n - 1; i++, j++) {
|
|
|
|
|
while (l <= r && days[minq[r]] >= days[j]) {
|
|
|
|
|
r--;
|
|
|
|
|
}
|
|
|
|
|
minq[++r] = j;
|
|
|
|
|
int cur = Math.max(days[i - 1], days[j + 1]);
|
|
|
|
|
if (days[minq[l]] > cur) {
|
|
|
|
|
ans = Math.min(ans, cur);
|
|
|
|
|
}
|
|
|
|
|
if (i == minq[l]) {
|
|
|
|
|
l++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (ans == Integer.MAX_VALUE) ? -1 : ans;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int kEmptySlots2(int[] bulbs, int k) {
|
|
|
|
|
int n = bulbs.length;
|
|
|
|
|
int[] days = new int[n];
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
days[bulbs[i] - 1] = i + 1;
|
|
|
|
|
}
|
|
|
|
|
int ans = Integer.MAX_VALUE;
|
|
|
|
|
for (int left = 0, mid = 1, right = k + 1; right < n; mid++) {
|
|
|
|
|
// 验证指针mid
|
|
|
|
|
// mid 永远不和left撞上的!
|
|
|
|
|
// 1) mid在left和right中间验证的时候,没通过!
|
|
|
|
|
// 2) mid是撞上right的时候
|
|
|
|
|
if (days[mid] <= Math.max(days[left], days[right])) {
|
|
|
|
|
// if(mid == right) { // left...right 达标的!
|
|
|
|
|
// int cur = Math.max(days[left], days[right]);
|
|
|
|
|
// ans = Math.min(ans, cur);
|
|
|
|
|
// left = mid;
|
|
|
|
|
// right = mid + k + 1;
|
|
|
|
|
// } else { // 验证不通过!
|
|
|
|
|
// left = mid;
|
|
|
|
|
// right = mid + k + 1;
|
|
|
|
|
// }
|
|
|
|
|
if (mid == right) { // 收答案!
|
|
|
|
|
ans = Math.min(ans, Math.max(days[left], days[right]));
|
|
|
|
|
}
|
|
|
|
|
left = mid;
|
|
|
|
|
right = mid + k + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (ans == Integer.MAX_VALUE) ? -1 : ans;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|