K Empty Slots

hard array sliding window

Problem

Bulbs[i] tells the position bloomed on day i+1. Return earliest day where two bulbs have exactly k empty slots between them, both bloomed.

Inputbulbs=[1,3,2] k=1
Output2
On day 2 positions {1,3} bloomed; one empty between them.

def k_empty_slots(bulbs, k):
    n = len(bulbs); days = [0] * n
    for d, p in enumerate(bulbs): days[p - 1] = d + 1
    best = 10**9; l, r = 0, k + 1
    while r < n:
        ok = True
        for i in range(l + 1, r):
            if days[i] < days[l] or days[i] < days[r]: l = i; r = i + k + 1; ok = False; break
        if ok: best = min(best, max(days[l], days[r])); l = r; r = l + k + 1
    return best if best < 10**9 else -1
function kEmptySlots(bulbs, k) {
  const n = bulbs.length; const days = new Array(n).fill(0);
  for (let d = 0; d < n; d++) days[bulbs[d] - 1] = d + 1;
  let best = Infinity, l = 0, r = k + 1;
  while (r < n) {
    let ok = true;
    for (let i = l + 1; i < r; i++) {
      if (days[i] < days[l] || days[i] < days[r]) { l = i; r = i + k + 1; ok = false; break; }
    }
    if (ok) { best = Math.min(best, Math.max(days[l], days[r])); l = r; r = l + k + 1; }
  }
  return isFinite(best) ? best : -1;
}
int kEmptySlots(int[] bulbs, int k) {
    int n = bulbs.length; int[] days = new int[n];
    for (int d = 0; d < n; d++) days[bulbs[d] - 1] = d + 1;
    int best = Integer.MAX_VALUE, l = 0, r = k + 1;
    while (r < n) {
        boolean ok = true;
        for (int i = l + 1; i < r; i++) if (days[i] < days[l] || days[i] < days[r]) { l = i; r = i + k + 1; ok = false; break; }
        if (ok) { best = Math.min(best, Math.max(days[l], days[r])); l = r; r = l + k + 1; }
    }
    return best == Integer.MAX_VALUE ? -1 : best;
}
int kEmptySlots(vector& bulbs, int k) {
    int n = bulbs.size(); vector days(n);
    for (int d = 0; d < n; d++) days[bulbs[d] - 1] = d + 1;
    int best = INT_MAX, l = 0, r = k + 1;
    while (r < n) {
        bool ok = true;
        for (int i = l + 1; i < r; i++) if (days[i] < days[l] || days[i] < days[r]) { l = i; r = i + k + 1; ok = false; break; }
        if (ok) { best = min(best, max(days[l], days[r])); l = r; r = l + k + 1; }
    }
    return best == INT_MAX ? -1 : best;
}
Time: O(n) Space: O(n)