###### tags: `LeetCode` `Binary Search` `Medium` # LeetCode #1482 [Minimum Number of Days to Make m Bouquets](https://leetcode.com/problems/minimum-number-of-days-to-make-m-bouquets/) ### (Medium) 給你一個整數數組 bloomDay,以及兩個整數 m 和 k 。 現需要製作 m 束花。製作花束時,需要使用花園中 相鄰的 k 朵花 。 花園中有 n 朵花,第 i 朵花會在 bloomDay[i] 時盛開,恰好可以用於一束花中。 請你返回從花園中摘 m 束花需要等待的最少的天數。如果不能摘到 m 束花則返回 -1。 --- 若m*n大於bloomDays.size(), 則直接回傳-1。 左值為最早開花時間, 右值為最晚開花時間。 在左值與右值中使用二元搜尋, 並使用for迴圈遍歷整個數組, 當遇到該天數還沒開花的位置時, 直接將記數歸零(因為不連續), 而若該位置開花則記數+1。 當記數值達到k時, 可製成一束花, 此時將花束數量+1, 記數歸零。 for迴圈結束後, 判斷花束數是否滿足m, 若滿足則將右值設為中值, 反之將左值設為中值加一。 最後, 若左值大於等於(其實是等於)數組中最大值+1, 則回傳-1, 反之回傳左值。 --- ``` class Solution { public: int minDays(vector<int>& bloomDay, int m, int k) { if(m*k>bloomDay.size())return -1; int l=INT_MAX, r=0; for(auto b:bloomDay){ l=min(l,b); r=max(r,b); } int max=r; while(l<r){ int mid=(r+l)/2; int nob=0, cnt=0; for(auto b:bloomDay){ if(b>mid){cnt=0;continue;} else cnt++; if(cnt>=k){ nob++; cnt=0; } } if(nob<m)l=mid+1; else r=mid; } if(l>=max+1)return -1; return l; } }; ```