【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣(LeetCode)

数对 (a,b) 由整数 ab 组成,其数对距离定义为 ab 的绝对差值。

给你一个整数数组 nums 和一个整数 k ,数对由 nums[i]nums[j] 组成且满足 0 <= i < j < nums.length 。返回 所有数对距离中k 小的数对距离。

示例 1:

输入:nums = [1,3,1], k = 1 输出:0 解释:数对和对应的距离如下: (1,3) -> 2 (1,1) -> 0 (3,1) -> 2 距离第 1 小的数对是 (1,1) ,距离为 0 。

示例 2:

输入:nums = [1,1,1], k = 2 输出:0

示例 3:

输入:nums = [1,6,1], k = 3 输出:5

提示:

  • n == nums.length

  • 2 <= n <= 10(4)

  • 0 <= nums[i] <= 10(6)

  • 1 <= k <= n * (n - 1) / 2

方法1,二分答案法,没有剪枝

1.

nums数组中的数对组合,下标分别为<0,1>,<0,2>...<0,n-1>

<1,2>,<1,3>....<1,n-1>

....

<n-2,n-1>

一共有n-1+n-2+....+1=((n-1)+1)*(n-1)/2=(n-1)*n/2对数对.

对于每一个数对,差值的绝对值,可以发现排序之后不会影响数组组合和结果.

我们需要找到所有数对距离从大到小排序之后的第k小的数对距离.

2.

将所有的数对距离排序之后,找到第k小的数对距离.

我们需要找一个数对距离的值,这个值是第k小的数对距离.

如果固定数对距离,可以求得他是第几小的数对距离,只需要求得小于等于limit的数对距离有多少个就知道这是第几小的数对距离.

用二分法找数对距离,判断数对距离是否是第k小的数对距离.

f(limit)函数返回小于等于limit数对距离的个数.如果小于k,说明数对距离不可能是答案.[0,limit]都不可能是答案.

去右边找答案.

如果是大于等于k,说明可能是答案,ret记录下来,去左边找可能的答案.

 
class Solution {
public:/*数对距离,二元组,排序和不排序不影响答案.数组n个元素,对应的数对个数是1+2+...+n-1=(1+n-1)*(n-1)/2=n*(n-1)/2分别下标对应<0,1><0,2>...<0,n-1>====> n-1<1,2>...<1,n-1>=====> n-2...<n-2,n-1>=====> 1数对距离的可能范围[0,num_max-nums_min]数对距离排序之后第k个,是我们要找的值数对距离排序后第k个数对距离是答案.二分答案法,f(limit)数对距离大于等于limit的个数.二分答案法,固定答案判断其他条件,更方便1,2,3,4,5,6*/vector<int> arr; // 保存输入的数组int k; // 第 k 小的数对距离int n; // 数组长度int ret; // 保存结果,即第 k 小的数对距离// 判断在给定的限制下,数对距离小于等于 limit 的个数是否大于等于 kbool f(int limit) {int count = 0; // 满足条件的数对个数for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (arr[j] - arr[i] <= limit) {count++;} else {break;}}}return count >= k;}// 初始化函数,计算数组长度并排序void init() {n = 0, ret = 0;sort(arr.begin(), arr.end());n = arr.size();}// 二分查找解决问题void solve() {int l = 0, r = arr[n - 1] - arr[0]; // 定义二分查找的左右边界while (l <= r) {int mid = l + ((r - l) >> 1); // 计算中间值if (f(mid)) { // 如果在当前限制下满足条件的数对个数大于等于 kret = mid; // 更新结果r = mid - 1; // 缩小右边界} else {l = mid + 1; // 增大左边界}}}// 主函数,计算第 k 小的数对距离int smallestDistancePair(vector<int>& _nums, int _k) {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 加速输入输出arr = _nums, k = _k;init(); // 调用初始化函数solve(); // 调用二分查找解决问题return ret; // 返回结果}
};

方法2,二分答案法,剪枝

1.

找小于等于limit的个数是否大于等于k.

这个过程j可以不用回退.

i和i+1~j-1数对距离都小于等于limit,但是i和j数对距离大于limit,那么i+1和i+1~j-1的数对距离也以一定小于等于limit.

所以j不需要回退,直接加上当前位置和j之间的个数.

如果ij相等j需要++.

 
class Solution {
public:/*数对距离,二元组,排序和不排序不影响答案.数组n个元素,对应的数对个数是1+2+...+n-1=(1+n-1)*(n-1)/2=n*(n-1)/2分别下标对应<0,1><0,2>...<0,n-1>====> n-1<1,2>...<1,n-1>=====> n-2...<n-2,n-1>=====> 1数对距离的可能范围[0,num_max-nums_min]数对距离排序之后第k个,是我们要找的值数对距离排序后第k个数对距离是答案.二分答案法,f(limit)数对距离大于等于limit的个数.二分答案法,固定答案判断其他条件,更方便1,2,3,4,5,6*/vector<int> arr;int k;int n;int ret;bool f(int limit) {// 判断在给定的限制下,数对距离小于等于 limit 的个数是否大于等于 kint count = 0;int j = 1;for (int i = 0; i < n; i++) {if (i == j)j++;count += j - i - 1;for (; j < n; j++) {//剪枝不回退if (arr[j] - arr[i] <= limit) {count++;} else {break;}}}return count >= k;}void init() {n = 0, ret = 0;sort(arr.begin(), arr.end());n = arr.size();}void solve() {int l = 0, r = arr[n - 1] - arr[0];while (l <= r) {int mid = l + ((r - l) >> 1);//位运算一定要加括号if (f(mid)) {ret = mid;r = mid - 1;} else {l = mid + 1;}}}int smallestDistancePair(vector<int>& _nums, int _k) {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);arr = _nums, k = _k;init();solve();return ret;}
};

N 台电脑的最长时间 - 力扣(LeetCode)

你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries ,其中第 i 个电池可以让一台电脑 运行 batteries[i] 分钟。你想使用这些电池让 全部 n 台电脑 同时 运行。

一开始,你可以给每台电脑连接 至多一个电池 。然后在任意整数时刻,你都可以将一台电脑与它的电池断开连接,并连接另一个电池,你可以进行这个操作 任意次 。新连接的电池可以是一个全新的电池,也可以是别的电脑用过的电池。断开连接和连接新的电池不会花费任何时间。

注意,你不能给电池充电。

请你返回你可以让 n 台电脑同时运行的 最长 分钟数。

示例 1:

输入:n = 2, batteries = [3,3,3] 输出:4 解释: 一开始,将第一台电脑与电池 0 连接,第二台电脑与电池 1 连接。 2 分钟后,将第二台电脑与电池 1 断开连接,并连接电池 2 。注意,电池 0 还可以供电 1 分钟。 在第 3 分钟结尾,你需要将第一台电脑与电池 0 断开连接,然后连接电池 1 。 在第 4 分钟结尾,电池 1 也被耗尽,第一台电脑无法继续运行。 我们最多能同时让两台电脑同时运行 4 分钟,所以我们返回 4 。

示例 2:

输入:n = 2, batteries = [1,1,1,1] 输出:2 解释: 一开始,将第一台电脑与电池 0 连接,第二台电脑与电池 2 连接。 一分钟后,电池 0 和电池 2 同时耗尽,所以你需要将它们断开连接,并将电池 1 和第一台电脑连接,电池 3 和第二台电脑连接。 1 分钟后,电池 1 和电池 3 也耗尽了,所以两台电脑都无法继续运行。 我们最多能让两台电脑同时运行 2 分钟,所以我们返回 2 。

提示:

  • 1 <= n <= batteries.length <= 10(5)

  • 1 <= batteries[i] <= 10(9)

1.

我们需要找运行时间,电池可以供电脑运行的最长的时间,我们找的这个时间一定有一个范围,0~所有时间累加和/n.

我们希望运行时间尽可能长.

f函数表示limit某一个特定的运行时间,电池是否可以供这些电脑运行这些时间.

如果不能说明limit这个运行时间短了,如果可以,再去更大的运行时间找,看看有没有更大的答案.

2.

f函数怎么判断这些电池能否供电脑运行这些时间,电池的电量如果大于等于limit,这个电池直接供一个电脑就可以了,如果电池电量小于limit说明,这个电池供完之后还需要其他的电池的帮助,这就是一个电池累加和,和总需要的电量的匹配问题.

只需要保证这些电池的累加和大于等于我们需要的电量即可.

所以我们需要将电量小于limit的电量累加,电脑数减去电量大于等于limit的个数,这个数乘以limit.

看累加电量是否大于等于n*limit.

3.

可以统一操作,如果不对n这个数进行修改,还原回去,左边就需要加上等量的值.也就是limit*(电量大于等于limit的个数).只需要电量大于等于limit的值加limit即可.

 
class Solution {
public:#define LL long long // 定义长整型别名int n; // 电脑的数量vector<int> arr; // 电池的电量数组LL ret; // 记录最长运行时间LL sum; // 电池电量总和// 判断在给定限制时间limit下,电池能否支持所有电脑运行bool f(LL limit) {LL totalTime = 0; // 记录总共供电时间for (int i = 0; i < arr.size(); ++i) {// 如果电池电量大于等于限制时间,则加上限制时间;否则,加上电池电量totalTime += arr[i] >= limit ? limit : arr[i];// 如果总供电时间大于等于限制时间乘以电脑数量,返回trueif (totalTime >= limit * n) {return true;}}return false; // 如果无法满足条件,返回false}// 初始化,计算电池电量总和void init() {sum = accumulate(arr.begin(), arr.end(), 0LL);}// 二分查找解决最长运行时间void solve() {LL l = 0, r = sum / n; // 左边界为0,右边界为电池总电量除以电脑数量while (l <= r) {LL mid = l + ((r - l) >> 1); // 计算中间值// 如果在中间值限制下可以满足条件,更新结果,并尝试更长时间if (f(mid)) {ret = mid;l = mid + 1;} else { // 否则,尝试更短时间r = mid - 1;}}}// 主函数,计算最大运行时间long long maxRunTime(int _n, vector<int>& _batteries) {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 加速输入输出n = _n; // 初始化电脑数量arr = _batteries; // 初始化电池数组init(); // 计算电池总电量solve(); // 二分查找计算最大运行时间return ret; // 返回结果}
};

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java调用远程接口下载文件

在postman中这样下载文件 有时下载文件太大postman会闪退&#xff0c;可以通过代码下载&#xff0c;使用hutool的http包

3步操作助您轻松实现苹果手机照片一键传输至电脑

对于很多使用苹果手机的用户来说&#xff0c;随着手机中照片和视频数量的不断积累&#xff0c;如何将这些珍贵的回忆从手机转移到电脑&#xff0c;以便更好地保存、整理和分享&#xff0c;成为了一个值得关注的问题。那么&#xff0c;苹果手机怎么把照片导入电脑呢&#xff1f;…

鸿蒙课程培训 | 讯方技术与鸿蒙生态服务公司签约,成为鸿蒙钻石服务商

3月15日&#xff0c;深圳市讯方技术股份有限公司与鸿蒙生态服务公司签署合作协议&#xff0c;讯方技术成为鸿蒙钻石服务商&#xff0c;正式进军鸿蒙原生应用培训开发领域。讯方技术总裁刘国锋、副总经理刘铭皓、深圳区域总经理张松柏、深圳区域交付总监张梁出席签约仪式。 作…

乡村振兴的乡村产业创新发展:培育乡村新兴产业,打造乡村产业新名片,促进乡村经济多元化发展

目录 一、引言 二、乡村产业创新发展的必要性 &#xff08;一&#xff09;适应新时代发展要求 &#xff08;二&#xff09;满足消费升级需求 &#xff08;三&#xff09;促进农民增收致富 三、培育乡村新兴产业策略 &#xff08;一&#xff09;加强科技创新引领 &#…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…

Java复习-集合篇

集合 集合分为俩大类 单列集合 每个元素数据只包含一个值 双列集合 每个元素包含俩个键值对 Conllection单列集合 单列集合常用的主要是下列几种 List集合 List系列集合的特点&#xff1a;添加元素是有序、可重复、有索引 这里我们来试一下ArrayList ArrayList<String&g…

Spring OAuth2:开发者的安全盾牌!(上)

何利用Spring OAuth2构建坚不可摧的安全体系&#xff1f;如何使用 OAuth2 从跨域挑战到性能优化&#xff0c;每一个环节都为你的应用保驾护航&#xff1f; 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…

智能仓储物流系统(WMS)系列-管理查询调整

好的应用系统应是细分简单&#xff0c;界面简洁易操作&#xff0c;程序代码简洁易懂的。

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法&#xff0c;有需要的小伙伴可以移步史上最全排序算法整理&#xff08;1&#xff09;查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中&#xff0c;将相邻的两个数进行比较&#xff0c;若前面的数比后面的数大就交换两…

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd&#xff0c;执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件&#xff0c;用记事本打开&#xff0c;并…

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、优点四、缺点五、怎么用六、细节 Spring Cloud Consul 一、需求 多个微服务之间通过RestTemplate中的api相互调用&#xff0c;一般要写死微服务的IP地址和端口号&#xff0c;相当于硬编码&#xff0c;非常不灵活&#xff0…

MyBatis出现:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本质上来说&#xff0c;是Mybatis使用上的错误&#xff0c;不熟悉&#xff0c;理…

SQL函数--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于结合两个或更多 SELECT 语句的结果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重复的行。这与 UNION 不同&#xff0c;因为 UNION 会自动删除重复的行。 满足条件&#xff1a; 1、两个select查询的列的数量必须相…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

企业网络的“瑞士军刀”:探索“一端多能”设备的多面性

在数字化时代&#xff0c;企业网络需求的复杂性和多样性不断增长&#xff0c;传统的单一功能网络设备已难以满足这些需求。企业需要一种集多种功能于一身的“一端多能”网络设备&#xff0c;以应对各种网络环境和业务需求&#xff0c;就像是一把多功能、灵活、可靠的瑞士军刀&a…

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

测试基础07:测试工作流程规范、进度同步与把控

课程大纲 1、迭代测试流程 2、测试流程 2.1、测试用例评审 目的&#xff1a;对齐产品需求理解&#xff0c;完善、优化测试场景。 参与方&#xff1a;项目、产品、开发、测试。 用例内容&#xff1a;冒烟用例&#xff08;主流程&#xff09; 功能用例。 2.2、冒烟测试 提测…

SOLIDWORKS正版价格多少钱

SOLIDWORKS作为目前应用较为广泛的3D CAD软件之一&#xff0c;具有强大的功能和实用性&#xff0c;它为各类工程设计提供综合解决方案。但是&#xff0c;正版SOLIDWORKS价格是个不可忽视的问题。那SOLIDWORKS的正版价格究竟如何呢&#xff1f;又是受什么因素影响&#xff1f; 先…

【论文阅读|cryoET】ICE-TIDE

简介 三维cryoET重建的保真度进一步受到采集过程中物理扰动的影响。这些扰动以各种形式表现出来&#xff0c;例如连续采集之间的样本漂移&#xff0c;导致连续投影未对准&#xff0c;或者由于未散射的电子而导致二维投影中的局部变形。 传统的冷冻电子断层扫描工作流程需要对…