5438. 製作 m 束花所需的最少天數
給你一個整數數組 bloomDay,以及兩個整數 m 和 k 。
現需要製作 m 束花。製作花束時,需要使用花園中 相鄰的 k 朵花 。
花園中有 n 朵花,第 i 朵花會在 bloomDay[i] 時盛開,恰好 可以用於 一束 花中。
請你返回從花園中摘 m 束花需要等待的最少的天數。如果不能摘到 m 束花則返回 -1 。
思路:
判斷是否能製作成指定數量的花束,這裏直接遍歷,計算連續花朵數量,達到k朵,就將花束加一。
int minDays(vector<int>& bloomDay, int m, int k) {
int len = bloomDay.size();
if(m*k > len)
{
return -1;
}
int r = len-1;
int l = 0;
vector<int> rec(bloomDay);
sort(rec.begin(), rec.end()); // 排序,使用二分法
while(l<= r)
{
int mid = (l+r)/2;
if(check(bloomDay, m, k, rec[mid]))
{
r = mid-1;
}
else
{
l = mid+1;
}
}
return rec[l];
}
bool check(vector<int>& bloomDay, int m, int k, int day)
{
int len = bloomDay.size();
//貪心法
int count = 0; //連續花朵數目
int cur = 0; //花束數量
for(int i = 0; i < len; ++i)
{
if(bloomDay[i] <=day)
{
//開花了
count++;
if(count == k)
{
//滿足製成花束
cur++;
count = 0;
}
if(cur == m)
{
return true;
}
}
else
{
count = 0;
}
}
return false;
}