Back to all solutions

#1482 - Minimum Number of Days to Make m Bouquets

Problem Description

You are given an integer array bloomDay, an integer m and an integer k.

You want to make m bouquets. To make a bouquet, you need to use k adjacent flowers from the garden.

The garden consists of n flowers, the ith flower will bloom in the bloomDay[i] and then can be used in exactly one bouquet.

Return the minimum number of days you need to wait to be able to make m bouquets from the garden.

If it is impossible to make m bouquets return -1.

Solution

/**
 * @param {number[]} bloomDay
 * @param {number} m
 * @param {number} k
 * @return {number}
 */
var minDays = function(bloomDay, m, k) {
  if (m * k > bloomDay.length) return -1;

  let left = 1;
  let right = Math.max(...bloomDay);
  let result = -1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (canMakeBouquets(mid)) {
      result = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return result;

  function canMakeBouquets(days) {
    let bouquets = 0;
    let flowers = 0;
    for (const bloom of bloomDay) {
      if (bloom <= days) {
        flowers++;
        if (flowers === k) {
          bouquets++;
          flowers = 0;
        }
      } else {
        flowers = 0;
      }
    }
    return bouquets >= m;
  }
};