# LeetCode 1482. Minimum Number of Days to Make m Bouquets https://leetcode.com/problems/minimum-number-of-days-to-make-m-bouquets/description/ ## 題目大意 做一束花束需要從花園拿連續 `k` 朵花,目標是做 `m` 束花束 `bloomDay` 是每朵花在第幾天綻放 問最少要等幾天才能完成目標?辦不到回傳 `-1` ## 思考 對於**等待的天數**,它是有個範圍的,也就是 `bloomDay` 裡最早開花的是下界、最晚開花是上界 而我們先不看實際花什麼時候開花,就會發現在這段可能的等待日子裡,日子顯然是有序的連續數字 所以我們可以對這段日子使用 binary search ,每次都猜中間的日子,之後只要檢驗能不能做出 `m` 束花束即可 ```cpp! class Solution { public: int minDays(vector<int> &bloomDay, int m, int k) { if (bloomDay.size() < static_cast<long>(m) * k) return -1; const auto minmax = minmax_element(bloomDay.begin(), bloomDay.end()); int l = *(minmax.first), r = *(minmax.second); while (l < r) { const int mid = (l + r) / 2; if (bouquetsMade(bloomDay, k, mid) < m) l = mid + 1; else r = mid; } return l; } private: int bouquetsMade(const vector<int> &bloomDay, int k, int waiting) { int cnt = 0, cur = 0; for (const int day : bloomDay) { if (day > waiting) cur = 0; else if (++cur == k) { ++cnt; cur = 0; } } return cnt; } }; ```