难度中等245收藏分享切换为英文接收动态反馈
给你一个整数数组 bloomDay
,以及两个整数 m
和 k
。
现需要制作 m
束花。制作花束时,需要使用花园中 相邻的 k
朵花 。
花园中有 n
朵花,第 i
朵花会在 bloomDay[i]
时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m
束花需要等待的最少的天数。如果不能摘到 m
束花则返回 -1 。
示例 1:
输入:bloomDay = [1,10,3,10,2], m = 3, k = 1 输出:3 解释:让我们一起观察这三天的花开过程,x 表示花开,而 _ 表示花还未开。 现在需要制作 3 束花,每束只需要 1 朵。 1 天后:[x, _, _, _, _] // 只能制作 1 束花 2 天后:[x, _, _, _, x] // 只能制作 2 束花 3 天后:[x, _, x, _, x] // 可以制作 3 束花,答案为 3
示例 2:
输入:bloomDay = [1,10,3,10,2], m = 3, k = 2 输出:-1 解释:要制作 3 束花,每束需要 2 朵花,也就是一共需要 6 朵花。而花园中只有 5 朵花,无法满足制作要求,返回 -1 。
示例 3:
输入:bloomDay = [7,7,7,7,12,7,7], m = 2, k = 3 输出:12 解释:要制作 2 束花,每束需要 3 朵。 花园在 7 天后和 12 天后的情况如下: 7 天后:[x, x, x, x, _, x, x] 可以用前 3 朵盛开的花制作第一束花。但不能使用后 3 朵盛开的花,因为它们不相邻。 12 天后:[x, x, x, x, x, x, x] 显然,我们可以用不同的方式制作两束花。
示例 4:
输入:bloomDay = [1000000000,1000000000], m = 1, k = 1 输出:1000000000 解释:需要等 1000000000 天才能采到花来制作花束
示例 5:
输入:bloomDay = [1,10,2,9,3,8,4,7,5,6], m = 4, k = 2 输出:9
提示:
bloomDay.length == n
1 <= n <= 10^5
1 <= bloomDay[i] <= 10^9
1 <= m <= 10^6
1 <= k <= n
通过次数34,833提交次数58,935
题解:本题的考点是二分法,二分法就要确定查找的范围是什么,查找的上下边界是什么,是否一定有解。本题中查找的是一个k个相邻的元素且都小于给定值的组合个数,下边界是k,因为至少有k个,上边界是数组最大值,因为超过数组最大值就没有太多意思了。判断是否有解,很简单,只要数组长度能够做出来这么多花就行了。
以下是代码:
class Solution {
int countTripleNums(vector<int>& nums,int tarValue,int k)
{
int count=0;
int i=0;
while(i<=nums.size()-k)
{
bool isfind=true;
for(int j=0;j<k;j++)
{
if(nums[i+j]>tarValue)
{
i=j+i+1;
isfind = false;
break;
}
}
if(isfind)
{
count++;
i+=k;
}
}
return count;
}
public:
int minDays(vector<int>& bloomDay, int m, int k) {
if(m*k>bloomDay.size())
return -1;
else
{
int left = k, right = *max_element(bloomDay.begin(), bloomDay.end());
while (left < right)
{
int mid = (right - left) / 2 + left;
if (countTripleNums(bloomDay,mid,k) < m)
{
left = mid + 1;
}
else
right = mid;
}
return left;
}
}
};
执行结果:
通过
显示详情
添加备注
执行用时:152 ms, 在所有 C++ 提交中击败了41.29%的用户
内存消耗:61.8 MB, 在所有 C++ 提交中击败了25.93%的用户
通过测试用例:91 / 91
提交一次过,还是挺开心的。