您现在的位置是:主页 > news > 做网站建设的联系电话/百度公司招聘

做网站建设的联系电话/百度公司招聘

admin2025/5/22 18:22:02news

简介做网站建设的联系电话,百度公司招聘,北京注册公司代理,合肥大型网站设计公司文章目录问题描述解题报告实现代码参考资料问题描述 给你一个整数数组 bloomDay,以及两个整数 m 和 k 。 现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。 花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,…

做网站建设的联系电话,百度公司招聘,北京注册公司代理,合肥大型网站设计公司文章目录问题描述解题报告实现代码参考资料问题描述 给你一个整数数组 bloomDay,以及两个整数 m 和 k 。 现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。 花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,…

文章目录

  • 问题描述
  • 解题报告
  • 实现代码
  • 参考资料

问题描述

给你一个整数数组 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

解题报告

很明显,用二分法。

实现代码

class Solution {
public:int minDays(vector<int>& bloomDay, int m, int k) {if(m*k>bloomDay.size()) return -1;int n=bloomDay.size();int l=0,r=*max_element(bloomDay.begin(), bloomDay.end()), mid;while(l<=r){mid=l+(r-l)/2;int result =judge(mid, m, k, bloomDay);if(result) r=mid-1;else l=mid+1;}return l;}int judge(int target, int m, int k, vector<int>& bloomDay){int counter=0, window=0;for(int i=0;i<bloomDay.size();i++){if(bloomDay[i]<=target) window++;else window=0;if(window==k){window=0;counter++;}}return counter>=m;}
};

还可以这样实现

class Solution {
public:int minDays(vector<int>& bloomDay, int m, int k) {if(m*k>bloomDay.size()) return -1;int l=0, r=*max_element(bloomDay.begin(), bloomDay.end()), mid;// cout<<l<<" "<<r<<endl;;// 这里为什么不能取等号呢?// 因为 若l=r而循环内的judge返回true时,死循环//若l=r且循环内的judge返回false时会不会错过答案呢?不会,因为此时l=mid+1>r,无法进入循环,跳出来返回rwhile(l<r){mid=l+(r-l)/2;if(judge(bloomDay, m, k, mid))r=mid;else l=mid+1;// cout<<l<<" "<<r<<" "<<mid<<endl;}return r;}bool judge(vector<int>& bloomDay,int m, int k, int mid){int cnt=0, window=0;for(int i=0;i<bloomDay.size();i++){if(bloomDay[i]<=mid) window++;else window=0;if(window==k){cnt++;window=0;}}// cout<<mid<<" "<<cnt<<endl;return cnt>=m;}
};

参考资料

[1] Leetcode 1482. 制作m束花所需的最少天数