原题
1482.制作m束花所需的最少天数
2020年6月14日 第193周周赛第3题
题解
判断某一天的时候是否能够完成花束的采摘很容易,主要就是能否快速找到符合要求的最小的那一天。
方法一
我们可以把开花的天数都存起来,行程一个数组(无重复),并排序。从头开始判断每一天是否可以完成花束收集,返回第一个符合要求的天数。
遗憾的是,本思路超时。
代码示例:
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
List<Integer> set=new ArrayList<>();
for(int b:bloomDay){
if(!set.contains(b))
set.add(b);
}
int d[]=set.stream().mapToInt(Integer::valueOf).toArray();;
Arrays.sort(d);
for(int b:d){
if(flowerEnough(b,bloomDay,m,k)){return b;}
}
return -1;
}
public boolean flowerEnough(int tian,int[] bloomDay,int m,int k){
//此方法判断第tian天时能否完成花束组合
int m1=m;
int k1=0;
for(int i=0;i<bloomDay.length;i++){
if(bloomDay[i]<=tian){
k1++;
if(k1==k){
m1--;
if(m1==0){return true;}
k1=0;
}
}
else{
k1=0;
}
}
return false;
}
}
//2020.06.23 19:34
//84 / 91 个通过测试用例 状态:超出时间限制
//
方法二
二分法。反正天数在1e9范围内,因此最多需要找30次。
本思路java代码示例:
/*
*@v7fgg
*执行用时:22 ms, 在所有 Java 提交中击败了62.23%的用户
*内存消耗:48.4 MB, 在所有 Java 提交中击败了100.00%的用户
*2020年6月23日 19:13
*/
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
int l=bloomDay.length;
if(l>=m*k){
int zuo=1;
int you=1000000000;
while(zuo<you){
int mid=(zuo+you)/2;
if(flowerEnough(mid,bloomDay,m,k)){you=mid;}
else{zuo=mid+1;}
}
return flowerEnough(zuo,bloomDay,m,k)?zuo:-1;
}
return -1;
}
public boolean flowerEnough(int tian,int[] bloomDay,int m,int k){
//此方法判断第tian天时能否完成花束组合
int m1=m;
int k1=0;
for(int i=0;i<bloomDay.length;i++){
if(bloomDay[i]<=tian){
k1++;
if(k1==k){
m1--;
if(m1==0){return true;}
k1=0;
}
}
else{
k1=0;
}
}
return false;
}
}