当前位置: 首页 > news >正文

【C++二分查找】1482. 制作 m 束花所需的最少天数

本文涉及的基础知识点

C++二分查找

LeetCode1482. 制作 m 束花所需的最少天数

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

C++二分查找

二分类型:寻找首端。
Check函数的参数范围:[1,p] p =max(bllomDay)
Check函数:
一,记录连续花的长度x。可制成y=x/k束花。
二,return ∑ \sum (y) >= m。

代码

核心代码

template<class INDEX_TYPE>
class CBinarySearch
{
public:CBinarySearch(INDEX_TYPE iMinIndex, INDEX_TYPE iMaxIndex):m_iMin(iMinIndex),m_iMax(iMaxIndex) {}template<class _Pr>INDEX_TYPE FindFrist( _Pr pr){auto left = m_iMin - 1;auto rightInclue = m_iMax;while (rightInclue - left > 1){const auto mid = left + (rightInclue - left) / 2;if (pr(mid)){rightInclue = mid;}else{left = mid;}}return rightInclue;}template<class _Pr>INDEX_TYPE FindEnd( _Pr pr){int leftInclude = m_iMin;int right = m_iMax + 1;while (right - leftInclude > 1){const auto mid = leftInclude + (right - leftInclude) / 2;if (pr(mid)){leftInclude = mid;}else{right = mid;}}return leftInclude;}
protected:const INDEX_TYPE m_iMin, m_iMax;
};class Solution {public:int minDays(vector<int>& bloomDay, int m, int k) {auto Check = [&](int mid) {int cnt2 = 0;int cnt1 = 0;for (const auto& n : bloomDay) {if (n <= mid) {cnt1++;}else {cnt2 += cnt1 / k;cnt1 = 0;}}cnt2 += cnt1 / k;return cnt2 >= m;};int ret =  CBinarySearch<int>(1, 1'000'000'000).FindFrist(Check);return Check(ret) ? ret : -1;}};

单元测试

vector<int> bloomDay;int m,k;TEST_METHOD(TestMethod11){bloomDay = { 1, 10, 3, 10, 2 }, m = 3, k = 1;auto res = Solution().minDays(bloomDay, m, k);AssertEx(3,res);}TEST_METHOD(TestMethod12){bloomDay = { 1,10,3,10,2 }, m = 3, k = 2;auto res = Solution().minDays(bloomDay, m, k);AssertEx(-1, res);}TEST_METHOD(TestMethod13){bloomDay = { 7,7,7,7,12,7,7 }, m = 2, k = 3;auto res = Solution().minDays(bloomDay, m, k);AssertEx(12, res);}TEST_METHOD(TestMethod14){bloomDay = { 1000000000,1000000000 }, m = 1, k = 1;auto res = Solution().minDays(bloomDay, m, k);AssertEx(1000000000, res);}TEST_METHOD(TestMethod15){bloomDay = { 1,10,2,9,3,8,4,7,5,6 }, m = 4, k =2;auto res = Solution().minDays(bloomDay, m, k);AssertEx(9, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.mrgr.cn/news/22995.html

相关文章:

  • QT接入播放摄像头RTSP流
  • spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据
  • Google AI 概述——喜欢的三点和不喜欢的两点
  • 力扣100题——二分查找
  • [Python学习日记-11] Python中的流程控制(while)
  • 学习笔记八:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台
  • LeetCode移除元素
  • 【C++ Primer Plus习题】14.1
  • 【Linux】万字解读<进程控制>:创建&中止&等待&替换
  • Linux 用户和组的增删改查,用户切换及权限超详细解读
  • SAP 免费学习网站推荐
  • 【AI绘画】Midjourney后置指令--seed、--tile、--q、--chaos、--w、--no详解
  • 20240910 每日AI必读资讯
  • Iceberg与SparkSQL写操作整合
  • 电压跟随器的作用是什么?
  • Vulnhub靶场 DC-1
  • 机器学习特征分析
  • 线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结
  • java 自定义注解校验实体类属性
  • 离心萃取机废旧磷酸铁锂电池回收工艺流程