Minimum Number of Days to Make m Bouquets

medium array binary search

Problem

Given bloomDay[i] (day flower i blooms), m bouquets each needing k adjacent flowers — return minimum days to make all m, or -1 if impossible.

InputbloomDay=[1,10,3,10,2], m=3, k=1
Output3
By day 3, flowers at indices 0,2,4 are bloomed — 3 single-flower bouquets.

def min_days(bloomDay, m, k):
    if m * k > len(bloomDay): return -1
    def can(d):
        bouquets = run = 0
        for x in bloomDay:
            if x <= d:
                run += 1
                if run == k: bouquets += 1; run = 0
            else:
                run = 0
        return bouquets >= m
    lo, hi = min(bloomDay), max(bloomDay)
    while lo < hi:
        mid = (lo + hi) // 2
        if can(mid): hi = mid
        else: lo = mid + 1
    return lo
function minDays(bd, m, k) {
  if (m * k > bd.length) return -1;
  function can(d) { let b = 0, r = 0; for (const x of bd) { if (x <= d) { r++; if (r === k) { b++; r = 0; } } else r = 0; } return b >= m; }
  let lo = Math.min(...bd), hi = Math.max(...bd);
  while (lo < hi) { const mid = (lo + hi) >>> 1; if (can(mid)) hi = mid; else lo = mid + 1; }
  return lo;
}
class Solution {
    public int minDays(int[] bd, int m, int k) {
        if ((long) m * k > bd.length) return -1;
        int lo = Integer.MAX_VALUE, hi = 0;
        for (int x : bd) { lo = Math.min(lo, x); hi = Math.max(hi, x); }
        while (lo < hi) {
            int mid = (lo + hi) >>> 1;
            if (can(bd, m, k, mid)) hi = mid; else lo = mid + 1;
        }
        return lo;
    }
    boolean can(int[] bd, int m, int k, int d) {
        int b = 0, r = 0;
        for (int x : bd) { if (x <= d) { r++; if (r == k) { b++; r = 0; } } else r = 0; }
        return b >= m;
    }
}
int minDays(vector& bd, int m, int k) {
    if ((long long) m * k > (int)bd.size()) return -1;
    int lo = *min_element(bd.begin(), bd.end()), hi = *max_element(bd.begin(), bd.end());
    auto can = [&](int d) {
        int b = 0, r = 0;
        for (int x : bd) { if (x <= d) { r++; if (r == k) { b++; r = 0; } } else r = 0; }
        return b >= m;
    };
    while (lo < hi) { int mid = (lo + hi) / 2; if (can(mid)) hi = mid; else lo = mid + 1; }
    return lo;
}
Time: O(n log(max−min)) Space: O(1)