二分算法02

二分算法02

  • 1. 每个小孩最多能分到多少糖果
  • 2. 准时到达的列车最小时速
  • 3. 在 D 天内送达包裹的能力

1. 每个小孩最多能分到多少糖果

给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 ,但 无法 再将两堆合并到一起。

另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩,使每个小孩分到 相同 数量的糖果。每个小孩可以拿走 至多一堆 糖果,有些糖果可能会不被分配。

返回每个小孩可以拿走的 最大糖果数目 。

真题点击此处:2226. 每个小孩最多能分到多少糖果

解题思路:
假设有一个长度为 n 的数组 candies,表示每个糖果的数量。现在我们希望将这些糖果平均分配给 k 个孩子。我们需要找到一个最大的正整数 x,使得将每个糖果分成 x 份后,每个孩子都可以得到至少一份,并且可以得到最大总糖果数。

  1. 我们首先定义两个指针 left 和 right,分别指向可能的最小值 1 和最大值 max(candies)。
  2. 然后我们使用二分查找的方法,不断缩小 left 和 right 的范围,直到 left > right 为止。
  3. 在每次循环中,我们计算 mid = (left + right) // 2,表示当前的糖果份数。
  4. 接着,我们遍历数组 candies,计算出将每个糖果分成 mid 份后,可以得到的总糖果数 ans。
  5. 如果 ans < k,说明当前的份数过多,我们需要将 right 指针左移,将搜索范围从右半部分继续缩小。
  6. 如果 ans >= k,说明当前份数过少或刚好符合要求,我们需要将 left 指针右移,将搜索范围从左半部分继续缩小。
  7. 最终返回 left - 1,即为最大的正整数 x。

具体解题思路可以总结为以下几点:

  • 定义两个指针 left 和 right,分别指向可能的最小值 1 和最大值 max(candies)。
  • 使用二分查找的方法,不断缩小 left 和 right 的范围,直到 left > right 为止。
  • 在每次循环中,计算 mid = (left + right) // 2,表示当前的糖果份数。
  • 遍历数组 candies,计算出将每个糖果分成 mid 份后,可以得到的总糖果数 ans。
  • 如果 ans < k,将 right 指针左移,将搜索范围从右半部分继续缩小。
  • 如果 ans >= k,将 left 指针右移,将搜索范围从左半部分继续缩小。
  • 最终返回 left - 1,即为最大的正整数 x。

这种方法利用了二分查找的特性,不断缩小搜索范围,最终得到符合要求的最大的正整数 x。

以下为代码实现:

class Solution:def maximumCandies(self, candies: List[int], k: int) -> int:left, right = 1, max(candies)while left <= right:mid = (left + right) // 2ans = 0for c in candies:ans += c // midif ans < k:right = mid - 1else:left = mid + 1return left - 1

时间复杂度:O(nlogm),其中 n 为糖果数组 candies 的长度,m 为糖果数组中最大的数值。

空间复杂度:O(1),该算法只使用了常数级别的额外空间用于存储变量。

2. 准时到达的列车最小时速

给你一个浮点数 hour ,表示你到达办公室可用的总通勤时间。要到达办公室,你必须按给定次序乘坐 n 趟列车。另给你一个长度为 n 的整数数组 dist ,其中 dist[i] 表示第 i 趟列车的行驶距离(单位是千米)。

每趟列车均只能在整点发车,所以你可能需要在两趟列车之间等待一段时间。

例如,第 1 趟列车需要 1.5 小时,那你必须再等待 0.5 小时,搭乘在第 2 小时发车的第 2 趟列车。
返回能满足你准时到达办公室所要求全部列车的 最小正整数 时速(单位:千米每小时),如果无法准时到达,则返回 -1 。

生成的测试用例保证答案不超过 107 ,且 hour 的 小数点后最多存在两位数字 。

真题点击此处:1870. 准时到达的列车最小时速

解题思路:
假设有一个长度为 n 的数组 dist,表示一系列区间的距离,以及一个代表旅行所需总时间的浮点数 hour。现在我们需要找到一个最小的速度 x,使得以这个速度行驶的话,可以在规定时间内完成旅程。

  1. 首先定义两个指针 left 和 right,分别指向可能的最小速度 1 和最大速度 10^7。
  2. 使用二分查找的方法,不断缩小 left 和 right 的范围,直到 left > right 为止。
  3. 在每次循环中,计算 mid = (left + right) // 2,表示当前的速度。
  4. 遍历数组 dist,计算以速度 mid 行驶时,所需的总时间 time。
  5. 如果 time <= hour,说明当前速度可以满足要求,我们需要将 right 指针左移,将搜索范围从右半部分继续缩小。
  6. 如果 time > hour,说明当前速度过慢,我们需要将 left 指针右移,将搜索范围从左半部分继续缩小。
  7. 最终返回 left,即为最小的速度 x。

具体解题思路可以总结为以下几点:

  • 定义两个指针 left 和 right,分别指向可能的最小速度 1 和最大速度 10^7。
  • 使用二分查找的方法,不断缩小 left 和 right 的范围,直到 left > right 为止。
  • 在每次循环中,计算 mid = (left + right) // 2,表示当前的速度。
  • 遍历数组 dist,计算以速度 mid 行驶时,所需的总时间 time。
  • 如果 time <= hour,将 right 指针左移,将搜索范围从右半部分继续缩小。
  • 如果 time > hour,将 left 指针右移,将搜索范围从左半部分继续缩小。
  • 最终返回 left,即为最小的速度 x。

这种方法利用了二分查找的特性,不断缩小搜索范围,最终得到符合要求的最小速度 x。

以下为代码实现:

class Solution:def minSpeedOnTime(self, dist: List[int], hour: float) -> int:left, right = 1, 10 ** 7while left <= right:mid = (left + right) // 2time = 0for i in range(len(dist) - 1):time += (dist[i] + mid - 1) // midtime += dist[-1] / midif time <= hour:right = mid - 1else:left = mid + 1return left if len(dist) < hour + 1 else -1

时间复杂度: O(nlogm),其中 n 为距离数组 dist 的长度,m 为距离数组中的最大值。

空间复杂度:O(1),该算法只使用了常数级别的额外空间用于存储变量。

3. 在 D 天内送达包裹的能力

传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。

真题点击此处:1011. 在 D 天内送达包裹的能力

解题思路:

  • 定义两个指针 left 和 right,分别指向货物重量的最大值和总和。
  • 使用二分查找的方法,不断缩小 left 和 right 的范围,直到 left > right 为止。
  • 在每次循环中,计算 mid = (left + right) // 2,表示当前的运载能力。
  • 遍历货物重量数组 weights,模拟运输过程,统计完成的运输批次 ans。
  • 根据 ans 与规定天数 days 的关系,调整 left 和 right 指针的位置。
  • 最终返回 left,即为最低的运载能力 x。

以下为代码实现:

class Solution:def shipWithinDays(self, weights: List[int], days: int) -> int:left, right = max(weights), sum(weights)while left <= right:mid = (left + right) // 2ans = 0s = midi = 0while i < len(weights):if s >= weights[i]:s -= weights[i]i += 1else:ans += 1s = midans += 1if ans <= days:right = mid - 1else:left = mid + 1return left

时间复杂度:O(nlogm),其中 n 为重量数组 weights 的长度,m 为所有重量的总和。

空间复杂度:O(1),该算法只使用了常数级别的额外空间用于存储变量。

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

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

相关文章

一文搞懂LDO !

7.LDO 1.原理 通过运放调节P-MOS的输出 低压差&#xff1a; 输出压降比较低&#xff0c;例如输入3.3V&#xff0c;输出可以达到3.2V。 线性&#xff1a; LDO内部的MOS管工作于线性状态。&#xff08;可变电阻区&#xff09; 稳压器&#xff1a; 说明了LDO的用途是用来给电…

Panalog大数据日志审计系统libres_syn_delete.php存在命令执行漏洞

文章目录 前言声明一、Panalog大数据日志审计系统简介二、漏洞描述三、影响版本四、漏洞复现五、整改意见 前言 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流量的信息进行日志留存&#xff0c…

Maven(基础)、MyBatis

简介 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型 (POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档 官网: http://maven.apache.org/ Maven作用 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#x…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;是通过地址总线把需要的数据从内存中读取的&#xff0c;后通过数据总线把处理后的数据放回内存中。如下图所示&#xff1a; 计算机把内存划分为⼀个个的内存单元&#xff0c;每…

php使用get_browser()函数将移动端和pc端分开

首先&#xff0c;确保你的PHP版本支持get_browser函数。get_browser函数是PHP内置的函数&#xff0c;但需要配置php.ini文件中的browscap参数&#xff0c;指定一个浏览器配置文件。 下载浏览器配置文件。你可以从 https://download.csdn.net/download/bigorange1/88850695 下…

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload&#xff0c;然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

Python编程语言学习

1.Python 特点 Python是一种简单、易读、易学和高效的编程语言&#xff0c;具有以下特点&#xff1a; 简单易学&#xff1a;Python采用清晰简洁的语法&#xff0c;注重代码的可读性和可维护性&#xff0c;使得初学者能够快速上手并编写出清晰的代码。 面向对象&#xff1a;Py…

Android EditText关于imeOptions的设置和响应

日常开发中&#xff0c;最绕不开的一个控件就是EditText&#xff0c;随之避免不了的则是对其软键盘事件的监听&#xff0c;随着需求的不同对用户输入的软键盘要求也不同&#xff0c;有的场景需要用户输入完毕后&#xff0c;有一个确认按钮&#xff0c;有的场景需要的是回车&…

GPIO控制和命名规则

Linux提供了GPIO子系统驱动框架&#xff0c;使用该驱动框架即可灵活地控制板子上的GPIO。 GPIO命名 泰山派开发板板载了一个40PIN 2.54间距的贴片排针&#xff0c;排针的引脚定义兼容经典40PIN接口。 在后续对GPIO进行操作前&#xff0c;我们需要先了解k3566的GPIO命名规则&a…

Unity开发过程中背包系统性能优化方案

在游戏开发中&#xff0c;背包系统是非常常见并且重要的一部分。然而&#xff0c;如果不合理地设计与实现&#xff0c;它可能导致游戏运行效率降低&#xff0c;影响玩家的游戏体验。在Unity中&#xff0c;背包系统的优化需要考虑以下几个方面&#xff1a; 1. 使用对象池&#x…

windows10重装系统后, 磁盘目录上出现了一个黄色三角感叹号和一把锁(BitLocker解锁)

BitLocker解锁 通过cmd命令窗口关闭Bitlocker锁 通过cmd命令窗口关闭Bitlocker锁 manage-bde -off D:执行这个命令之后会发现提示【解密正在进行中】&#xff0c;但是一般来说对于这种所谓的进行中都会想要明确的看到进度显示 那么就需要用到下一个命令了 manage-bde -status…

vue transition结合animate.css动画库

transition结合animate.css动画库 安装 npm install animate.css --save 在main.js中引用 import animated from animate.css Vue.use(animated) 在transition标签上使用 <transition enter-active-class"animate__animated animate__fadeInUp" leave-acti…

SQL-2

刷题知识点&#xff1a; null不能用这种判断&#xff0c;要用is null 或者is not null 或者可用 ifnull来判断。 明确&#xff1a;数据库DB是数据存储仓库。 数据库管理系统&#xff08;Database management system&#xff0c;DBMS&#xff09;&#xff0c;是操纵和管理数据库…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例&#xff1a;构建一个去中心化身份系统案例 Demo&#xff1a;创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1&#xff1a;管…

http相关概念以及apache的功能

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

见微知著:数据可视化助力数字化时代决策智慧

在数字化时代的浪潮中&#xff0c;数据可视化显然是推动数字化进程不可或缺的利器。通过将复杂的数据转化为直观的图形和图表&#xff0c;数据可视化为企业和组织提供了更清晰、更有效的方式来理解和应用大量的数字信息。下面我就以可视化从业者的角度&#xff0c;来简单聊聊这…

浅谈TCP协议的可靠含义和三次握手

这里不过多阐述计算机网络的体系结构&#xff0c;本文主要是想阐述三次握手和可靠连接之间的联系。TCP协议全称传输控制协议&#xff08;Transmission Cotrol Protocol&#xff09;。 1、TCP协议运行在哪一层 TCP运行在运输层。 2、TCP协议的可靠是什么意思 步入主题&…

maven异常记录-must be unique

maven 打包异常记录 我们可以看看一个重要的异常&#xff1a; dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: org.springframework.boot:spring-boot-starter-test 经过检查pom文件 果然是spring-boot-starter-test引用重复&#xff0c;平…

c编译器学习01:tcc、chibicc简介

出发点 最近在调研大量c代码&#xff0c;人工效率比较低&#xff0c;感觉能用c编译器&#xff0c;实现自动生成代码、自动检查代码…都需要一个基础&#xff1a;c编译器。 tcc https://bellard.org/tcc/ 这个是我目前准备使用的编译器&#xff0c;因为"With libtcc, yo…

rocketMQ-Dashboard安装与部署

1、下载最新版本rocketMQ-Dashboard 下载地址&#xff1a;https://github.com/apache/rocketmq-dashboard 2、下载后解压&#xff0c;并用idea打开 3、修改配置 ①、修改端口及rocketmq服务的ip&#xff1a;port ②、修改访问账号、密码 3、然后启动访问&#xff1a; 4、mav…