1482. 制作 m 束花所需的最少天数
目录
- 题目
- 过程
- 解法
题目
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。
过程
一定不要有乘积的运算
这种大数据用例会溢出
https://leetcode.cn/problems/minimum-number-of-days-to-make-m-bouquets/solutions/2988190/er-fen-cha-zhao-by-hai-mian-bo-bo-988o
解法
class Solution {
public:int minDays(vector<int>& bloomDay, int m, int k) {int low=1;int high=0;int tem_k=0;//记录相邻的情况int tem_bl=0;//统计开花数int tem_fl=0;//统计花束if(m>bloomDay.size()/k){return -1;}//等待的天数在(1~最大开花日)之间for(auto num:bloomDay){high=max(num,high);}//二分查找最小等待天数while(low<high){tem_bl=0;//统计开花数tem_k=0;tem_fl=0;//统计花束int mid=low+(high-low)/2;vector<int> temp(bloomDay.size(),0);//记录每天的开花数for(int i=0;i<bloomDay.size();i++){//统计,temp数组记录了某一天的开花情况if(bloomDay[i]<=mid){temp[i]=1; }}//对temp数组进行统计for(int i=0;i<temp.size();i++){if(temp[i]==1){tem_k++;tem_bl++;}else{tem_k=0;//置零重新统计tem_bl=0;}//可用花束够而且相邻条件满足那就花束+1if(tem_bl==k ){if(tem_k==k){tem_fl++;tem_k=0;//置零重新统计tem_bl=0;}}}//如果在猜测的天数,花束少于要求花束,说明还需要等待if(tem_fl<m){low=mid+1;}else{high=mid;}}return low;}
};
二分查找拿下了,如果问题再复杂一些,也就是限制条件更多点,统计多一点,多两个for循环和判断的事情。