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

【C++二分查找 贪心】1552. 两球之间的磁力

本文涉及的基础知识点

C++二分查找
贪心:决策兼容性

LeetCode1552. 两球之间的磁力

在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。
已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。
给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。
示例 1:
在这里插入图片描述

输入:position = [1,2,3,4,7], m = 3
输出:3
解释:将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。
示例 2:
输入:position = [5,4,3,2,1,1000000000], m = 2
输出:999999999
解释:我们使用位于 1 和 1000000000 的篮子时最小磁力最大。

提示:
n == position.length
2 <= n <= 105
1 <= position[i] <= 109
所有 position 中的整数 互不相同 。
2 <= m <= position.length

二分查找+贪心(决策包容性)

性质一:一定存在最优解,最左边的篮子有球。否则将最左边的球,移到最左边的篮子。
性质二:令最优的解的最小磁力是x。第i个球和第i+1个球之间一定没有符合以下条件的空篮子:
距离第i个球的距离大于等于x。如果有将第i+1个球移到此空篮子。
结果性质一、性质二,第i+1球一定是距离第i个i球大于等于x的第一个空篮子。
先对position排序。
二分类型:寻找尾端
Check函数参数范围:[1,1e9]
Check函数:
计算最小磁力mid的情况下,能放cnt个球。return cnt >= 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 maxDistance(vector<int>& position, int m) {sort(position.begin(), position.end());auto Check = [&](int mid) {int cnt = 0;int pre = INT_MIN/2;for (const auto& p : position) {if (p - pre >= mid) {cnt++;pre = p;}}return cnt >= m;};return CBinarySearch<int>(1, 1'000'000'000).FindEnd(Check);}};

单元测试

vector<int> position;int m;TEST_METHOD(TestMethod1){position = { 999'999'999,1'000'000'000 }, m = 2;auto res = Solution().maxDistance(position, m);AssertEx(1, res);}TEST_METHOD(TestMethod2){position = { 1'000'000'000, 999'999'999 }, m = 2;auto res = Solution().maxDistance(position, m);AssertEx(1, res);}TEST_METHOD(TestMethod11){position = { 1, 2, 3, 4, 7 }, m = 3;auto res = Solution().maxDistance(position, m);AssertEx(3, res);}TEST_METHOD(TestMethod12){position = { 5,4,3,2,1,1000000000 }, m = 2;auto res = Solution().maxDistance(position, m);AssertEx(999999999, 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++**实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言 | Leetcode C语言题解之第384题打乱数组
  • 五、代理模式
  • E1.S接口如何解决SSD过热问题?
  • AI问答-协议-上传协议:FTP、FTPS、SFTP
  • 【算法 动态规划 简单多状态 dp 问题】打家劫舍题型
  • 第十七章 rust异步库tokio入门
  • Web安全之XSS跨站脚本攻击
  • Jmeter执行多机联合负载
  • 【Ubuntu22.04】搭建Android开发环境
  • npm登录
  • 做短视频素材哪里找?10个自媒体必备的短视频素材网站分享给你
  • webpack-01
  • Java 面试题:事务隔离级别以及并行事务会出现什么问题怎么解决脏读、不可重复读和幻读问题 --xunznux
  • python3兼容python2吗
  • js中数组的定义及使用
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Angular2开发踩坑系列-生产环境编译
  • Markdown 语法简单说明
  • php的插入排序,通过双层for循环
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初识 beanstalkd
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 什么是Javascript函数节流?
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #NOIP 2014#Day.2 T3 解方程
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (k8s)Kubernetes本地存储接入
  • (SpringBoot)第二章:Spring创建和使用
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (多级缓存)缓存同步
  • (面试必看!)锁策略
  • (三)mysql_MYSQL(三)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Linux下编译安装log4cxx
  • (自用)交互协议设计——protobuf序列化
  • .Mobi域名介绍
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .Net FrameWork总结
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net7 环境安装配置
  • .NetCore项目nginx发布
  • .NET处理HTTP请求
  • .Net各种迷惑命名解释
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @SuppressWarnings注解
  • @Transactional 参数详解
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧