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

【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.kler.cn/a/297925.html

相关文章:

  • RAG与LLM原理及实践(16)---RAG 前端技术Flask-socketIO
  • PySpark
  • 数据结构(7.1)——查找的基本概念
  • git svn 日记
  • Win10安装.net FrameWork3.5失败解决方法
  • 【北京迅为】《STM32MP157开发板使用手册》- 第十五章 制作最小linux系统
  • Android ADB抓取APP运行日志(adb logcat -v time)
  • MySQL表的操作与数据类型
  • MySQL——视图(三)应用实例——视图的应用
  • python进阶篇-day09-数据结构与算法(非线性结构与排序算法)
  • 【软件设计】常用设计模式--单例模式
  • 4G工业路由器:SR700的智能连接解决方案
  • 详细讲解hive on tez中各个参数作用,以及如何优化sql
  • iOS——通知协议代理
  • 两个实用小函数--多线程装饰器和自动记录退出程序
  • 极狐GitLab 新一代容器镜像仓库正式上线啦!
  • 【OpenCV-图像梯度】Scharr算子和laplacian算子
  • 闲鱼放弃成为淘宝复刻版了吗?上线学生专属交易交流版块“学生鱼”频道
  • 自己动手实现mybatis的底层框架(不用动态代理直接用执行器、用动态代理自己实现。图文分析!)
  • nohup与