二分算法01

news/2024/11/24 12:12:23/

二分算法01

  • 1. H指数II
  • 2. 使结果不超过阈值的最小除数
  • 3. 完成旅途的最少时间

1. H指数II

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)至少 有 h 篇论文分别被引用了至少 h 次。

请你设计并实现对数时间复杂度的算法解决此问题。

真题点击此处:275. H 指数 II

解题方法:二分查找
思路:由于数组 citations 已经按照升序排序,并且查找的范围小于数组的长度,因此可以使用二分查找。

设查找范围的初始左边界 left 为 0, 初始右边界 right 为 n−1,其中 n 为数组 citations 的长度。每次在查找范围内取中点 mid,则有 n−mid篇论文被引用了至少 citations[mid]次。如果在查找过程中满足 citations[mid]≥n−mid,则移动右边界 right,否则移动左边界 left。

以下为代码实现:

class Solution:def hIndex(self, citations: List[int]) -> int:left, right = 0, len(citations) - 1n = len(citations)while left <= right:mid = (left + right)  // 2if citations[mid] >= n - mid:right = mid - 1else:left = mid + 1return n - left

时间复杂度:O(logn),使用了二分算法来查找数据。
空间复杂度:O(1),只使用了额外的常量级空间。

2. 使结果不超过阈值的最小除数

给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。

请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。

每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。

题目保证一定有解。

真题点击此处:1283. 使结果不超过阈值的最小除数

解题方法:二分查找
思路:
1.初始化左边界 left 为1,右边界 right 为列表 nums 中的最大值。
2.进入循环,当 left 小于等于 right 时进行迭代:

  • 计算中间值 mid,为 left 和 right 的平均值。
  • 初始化变量 ans 为0,用于计算将列表中的所有数除以 mid 后的结果总和。
  • 遍历列表 nums,对每个数执行以下操作:
    • 将当前数加上 mid-1 后再除以 mid,得到向上取整的结果,并累加到 ans 中。
  • 判断 ans 是否小于等于阈值 threshold:
    • 如果是,说明当前 mid 可能是一个解,将右边界 right 更新为 mid-1。
    • 如果不是,说明当前 mid 不满足条件,将左边界 left 更新为 mid+1。

3.循环结束后,返回左边界 left。

以下为代码实现:

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

时间复杂度:O(Nlog⁡C),其中 C是一个常数,为二分查找的上下限之差。在本题给定的数据范围的限制下,C 不会超过 10^6 。
空间复杂度:O(1)。

3. 完成旅途的最少时间

给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。

每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运行,也就是说可以同时有多辆公交车在运行且互不影响。

给你一个整数 totalTrips ,表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间。

真题点击此处:2187. 完成旅途的最少时间

解题方法:二分查找
思路:
1.初始化左边界 left 为1,右边界 right 为t * totalTrips(因为最大值的时间不可能超过最小时间 * 旅途的趟数)。
2.进入循环,当 left 小于等于 right 时进行迭代:

  • 计算中间值 mid,为 left 和 right 的平均值。
  • 初始化变量 ans 为0,用于计算在 mid 时间内完成任务的总次数。
  • 遍历列表 time,对每个时间执行以下操作:
    • 将 mid 除以当前时间得到的商累加到 ans 中,表示在 mid 时间内完成当前任务的次数。
  • 判断 ans 是否小于总任务数 totalTrips:
    • 如果是,说明当前 mid 时间不足以完成所有任务,将左边界 left 更新为 mid+1。
    • 如果不是,说明当前 mid 时间足以完成所有任务,将右边界 right 更新为 mid-1。

3.循环结束后,返回左边界 left。

以下为代码实现:

class Solution:def minimumTime(self, time: List[int], totalTrips: int) -> int:t = min(time)left, right = 1, t * totalTripswhile left <= right:mid = (left + right) // 2ans = 0for t in time:ans += mid // tif ans < totalTrips:left = mid + 1else:right = mid - 1return left

时间复杂度:O(Nlog⁡C),其中 C是一个常数,为二分查找的上下限之差。
空间复杂度:O(1)。


http://www.ppmy.cn/news/1353728.html

相关文章

JavaWeb之请求

请求 客户端请求由ServletRequest类型的request对象表示&#xff0c;在HTTP请求场景下&#xff0c;容器提供的请求对象的具体类型为HttpServletRequest HTTP的请求消息分为三部分&#xff1a;请求行、请求头、请求正文。 请求行对应方法 // 获取请求行中的协议名和版本public S…

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定

STM32F1 - 中断系统

Interrupt 1> 硬件框图2> NVIC 中断管理3> EXTI 中断管理3.1> EXTI与NVIC3.2> EXTI内部框图 4> 外部中断实验4.1> 实验概述4.2> 程序设计 5> 中断向量表6> 总结 1> 硬件框图 NVIC&#xff1a;Nested Vectored Interrupt Controller【嵌套向量…

完成端口的看法

很早之前使用过完成端口&#xff0c;当时觉得是很不错的技术。但是后来发现用的地方并不多&#xff0c;对它也有些自己的想法&#xff0c;仁者见仁智者见智。 应用场景上&#xff0c; 个人觉得&#xff0c;iocp有些鸡肋&#xff0c;一般的应用用不上&#xff0c;复杂的程序…

探讨:工业物联网,纯上报设备的数采

事情是这样的&#xff0c;有一台设备是modbus-tcp协议&#xff0c;手工操作测量&#xff0c;自动发送测量结果&#xff0c;就这&#xff0c;没别的了。 开始看起来挺简单&#xff0c;连接上去就等着收数据嘛&#xff0c;多简单&#xff01;后来发现麻烦得很啊&#xff0c;关键的…

SP1:基于Plonky3构建的zkVM

1. 引言 SP1为SuccictLab开源的&#xff0c;基于Plonky3构建的zkVM。 开源代码见&#xff1a; https://github.com/succinctlabs/sp1&#xff08;Rust&#xff09; 当前暂未实现onchain-verifier&#xff0c;但会采用标准的STARK->SNARK verifier。 SP1 zkVM基于的指令…

【杂谈】裁我?我是研发,我是研发啊!

闲谈 这两年互联网是越来越不太平了&#xff0c;前有国外互联网裁员的妖风四起&#xff0c;后来寒气又传到国内&#xff0c;让我们这群打工人叫苦连天。最近有部电影蛮火的&#xff0c;叫《年会不能停》&#xff0c;感觉跟我前司很相似&#xff0c;不过好像由于今年业绩不太行…

OpenAI首个文生视频模型亮相,你觉得咋样?

2月16日凌晨&#xff0c;OpenAI再次扔出一枚深水炸弹&#xff0c;发布了首个文生视频模型Sora。据介绍&#xff0c;Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 目前官网上已经更新了48个视频d…