Minimum Number of Days to Make m Bouquets

MediumArrayBinary Search

Solution

export function minDays(bloomDay: number[], m: number, k: number): number {
  if (bloomDay.length < m * k) {
    return -1;
  }
 
  const maxBloomDay = bloomDay.reduce((prev, day) => Math.max(prev, day), 1);
  let [left, right] = [1, maxBloomDay];
  while (left < right) {
    const mid = Math.floor((left + right) / 2);
 
    let [flowers, bouquets] = [0, 0];
    for (const day of bloomDay) {
      flowers = mid < day ? 0 : flowers + 1;
      if (k <= flowers) {
        flowers = 0;
        bouquets += 1;
      }
    }
    if (m <= bouquets) {
      right = mid;
    } else {
      left = mid + 1;
    }
  }
  return left;
}