二分查找
文章平均质量分 95
二分查找的概念以及LeetCode的相关题目。
伟大的车尔尼
走自己的路,让别人去说吧!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二分查找题目:山脉数组中查找目标值
根据山脉数组的定义,山脉数组中存在唯一的最大值,该最大值为峰顶元素,峰顶元素所在下标为峰顶下标,峰顶左侧和右侧为两个非空子数组。峰顶左侧的子数组为严格单调递增的数组,峰顶右侧的子数组为严格单调递减的数组,因此峰顶同一侧的子数组中的元素各不相同。如果一个元素在山脉数组中出现且该元素不是峰顶元素,则该元素最多在山脉数组中出现两次,即在峰顶左侧的子数组和峰顶右侧的子数组中最多各出现一次。如果峰顶元素等于目标值,则由于峰顶元素在山脉数组中只出现一次,因此峰顶下标即为元素值等于目标值的最小下标,返回峰顶下标。原创 2025-01-30 18:00:00 · 749 阅读 · 1 评论 -
二分查找题目:寻找两个正序数组的中位数
将两个数组的左边部分统称为前半部分,将两个数组的右边部分统称为后半部分,则前半部分的最大值小于等于后半部分的最小值,前半部分的元素个数为两个数组的长度之和的一半向上取整。的值减去排除的元素个数,并将排除元素的数组的相应下标更新为该数组首个剩余元素的下标,具体做法如下:如果排除的是。中的最小值是后半部分的最小值。两个数组的左边部分的长度之和为两个数组的长度之和的一半向上取整,是偶数时,中位数是前半部分的最大值与后半部分的最小值的平均数。两个数组的左边部分的最大值小于等于两个数组的右边部分的最小值,原创 2025-01-27 18:00:00 · 1019 阅读 · 0 评论 -
二分查找题目:快照数组
操作,需要对快照数组的每个下标维护元素值信息,即每个下标处需要维护一个列表记录每次更新的快照编号和更新后的元素值,列表中的每个元素为快照编号和最新元素值的对,且按照快照编号非严格升序排序。并返回更新前的快照编号,因此在整个过程中,快照编号满足非严格单调递增。的快照编号,由于初始时快照数组中的每个元素都等于。处的列表中添加一个元素,该元素为当前快照编号和。的最大快照编号的元素,并返回该元素的值。的最大快照编号的元素,因此初始时。处的元素的快照编号即为小于等于。的最大快照编号,返回列表下标。原创 2025-01-23 18:00:00 · 968 阅读 · 0 评论 -
二分查找题目:基于时间的键值存储
对于每个关键字,维护一个列表存储该关键字的所有时间戳和值的信息,列表中的每个元素为时间戳和值的对,且按照时间戳升序排序。操作的顺序记录每个关键字对应的所有时间戳和值的信息时,一定满足记录的信息按照时间戳严格升序,此时可以使用二分查找的方式找到相应的值。设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。为了根据给定的关键字和时间戳得到相应的值,需要记录每个关键字对应的所有时间戳和值的信息。的最大时间戳的元素,并返回该元素的值。等于列表的最大下标。原创 2025-01-20 18:00:00 · 873 阅读 · 0 评论 -
二分查找题目:在线选举
对于每个时刻的选票,更新该选票投给的候选人的票数,如果该候选人的票数大于等于当前领先的候选人的票数(由于平局时最近获得选票的候选人领先,因此也需要考虑票数相等的情况),则更新当前领先的候选人编号。为了快速得到选举中特定时刻领先的候选人,需要在初始化时预处理投票信息,对于每张选票,更新候选人的票数,并记录该时刻领先的候选人。的最后一次投票时刻,然后在每个时刻领先的候选人数组中找到该时刻领先的候选人并返回。的最后一次投票时刻,并计算该时刻每个候选人的票数,得到在选举中领先的候选人。构造方法中预处理投票信息。原创 2025-01-16 18:00:00 · 893 阅读 · 0 评论 -
二分查找题目:乘法表中第 k 小的数
个数,该数据规模下生成乘法表的做法是不可行的,必须使用时间复杂度更低的做法。小的数,最朴素方法是生成完整的乘法表,然后遍历乘法表寻找第。的时间计算小于等于特定值的数的个数,因此总时间复杂度是。因此,这道题是二分查找判定问题,需要找到最小的整数。的时间计算小于等于特定值的数的个数,时间复杂度是。的数的个数,需要计算乘法表的每一行中小于等于。假设乘法表的列数无限,乘法表的第。的数的个数之后,即可得到乘法表中小于等于。时,可以在转置后的乘法表中寻找第。在计算乘法表的每一行中小于等于。的数的个数,执行如下操作。原创 2025-01-13 18:00:00 · 1408 阅读 · 0 评论 -
二分查找题目:寻找峰值 II
考虑矩阵每一行的最大值,其中一定存在一个最大值是峰值。在矩阵的行下标范围中执行二分查找,二分查找的次数是。的最大值都不是峰值,因此每一行的最大值都小于上一行同列的元素,每一行的最大值都小于上一行的最大值。不会超出矩阵行下标范围),判断可能存在峰值的下标范围,调整查找的下标范围。一个二维网格中的峰值元素是指其值严格大于相邻值(左、右、上、下)的元素。的大小关系判断可能存在峰值的行下标范围,并在更小的范围内查找峰值。分别表示二分查找的行下标范围的下界和上界,初始时。的最大值即为峰值,找到峰值并返回其位置。原创 2025-01-09 18:00:00 · 865 阅读 · 0 评论 -
二分查找题目:寻找峰值
因此需要使用二分查找的做法寻找峰值。二分查找的过程中需要判断可能存在峰值的下标范围,缩小查找的下标范围。不会超出数组下标范围),判断可能存在峰值的下标范围,调整查找的下标范围。的大小关系判断可能存在峰值的下标范围,并在更小的范围内查找峰值。,找到一个峰值元素并返回其下标。分别表示二分查找的下标范围的下界和上界,初始时。基于上述思路,可以使用二分查找的做法寻找峰值。中可能存在峰值,在该下标范围中继续查找。中可能存在峰值,在该下标范围中继续查找。的数组中寻找峰值的时间复杂度是。中存在峰值,则下标范围。原创 2025-01-06 18:00:00 · 1846 阅读 · 0 评论 -
二分查找题目:寻找右区间
由于题目要求返回每个区间的右区间对应的下标,因此在将区间按照起点升序排序时需要记录每个区间的下标,具体做法是新建一个数组记录每个区间的起点和下标,将新数组按照起点升序排序。为了找到每个区间的右区间,可以将每个区间按照起点升序排序,然后使用二分查找寻找右区间,对于每个区间寻找右区间的时间复杂度从。,对于每个区间在新数组中寻找大于等于当前区间终点的最小起点,该起点对应的下标即为当前区间的右区间对应的下标。个区间的起点与当前区间的终点的关系,调整查找的下标范围。个区间的起点小于当前区间的终点,则右区间位于第。原创 2025-01-02 18:00:00 · 1664 阅读 · 0 评论 -
二分查找题目:寻找旋转排序数组中的最小值 II
这道题也可以使用二分查找的思想,但是由于数组中可能存在重复元素,因此无法保证达到二分查找的时间复杂度。由于被排除的下标都不可能是最小值所在下标,因此。,则无法确定两个有序子数组的分界位置(即第二个有序子数组的开始下标)是在。为了寻找旋转排序数组中的最小值,需要得到旋转排序数组中的最小值所在下标。处的数,判断该数位于哪一个有序子数组中,调整查找的下标范围。的右边,此时无法将查找的下标范围缩小一半,因此在下标范围。由于被排除的下标都不可能是最小值所在下标,因此。,当该条件不成立时,二分查找结束,此时的。原创 2024-12-30 18:00:00 · 871 阅读 · 0 评论 -
二分查找题目:搜索旋转排序数组 II
这道题也可以使用二分查找的思想,但是由于数组中可能存在重复元素,因此无法保证达到二分查找的时间复杂度。三个元素不完全相等,则可以根据这三个元素值与目标值的大小关系确定目标值可能出现的下标范围,调整查找的下标范围。处的数,判断该数是否等于目标值以及位于哪一个有序子数组中,调整查找的下标范围。,则无法确定两个非递减子数组的分界位置(即第二个非递减子数组的开始下标)是在。时,整个数组是一个非递减数组,即第二个非递减子数组的长度是。的右边,此时无法将查找的下标范围缩小一半,因此在下标范围。开始的有序子数组中。原创 2024-12-26 18:00:00 · 600 阅读 · 0 评论 -
二分查找题目:两球之间的磁力
个球,当最小距离确定时,应该在确保相邻的球之间的距离不小于最小距离的前提下尽可能放入更多的球。因此,第一个球应该放到最左边的篮子中,后面的每个球应该放到与前一个球的距离大于等于最小距离的最近的篮子中。由于两个球之间的磁力等于两个球之间的距离,因此为了得到最小磁力,需要计算最小距离。在代号为地球 C-137 的世界中,Rick 发现如果他将两个球放在他新发明的篮子中,它们之间会形成特殊形式的磁力。,判断每个球应该放到哪些篮子中,并计算放到篮子中的球的总数。由于最大距离为两端的篮子之间的距离,因此。原创 2024-12-23 18:00:00 · 967 阅读 · 0 评论 -
二分查找题目:制作 m 束花所需的最少天数
如果等待天数大于等于最少天数,则可以制作全部花束;如果等待天数小于最少天数,则不能制作全部花束。因此,这道题是二分查找判定问题,需要找到最少天数。由此可以得到每朵花是否盛开,并根据连续盛开的花朵数计算可以制作多少束花。作为等待天数,判断是否可以制作全部花束,执行如下操作。朵,因此当所有花都盛开时,一定可以制作全部花束。由于当所有花都盛开时一定可以制作全部花束,因此。时可以制作全部花束,则最少天数小于等于。时不能制作全部花束,则最少天数大于。时,制作全部花束需要的花不超过。朵花,无法满足制作要求,返回。原创 2024-12-19 18:00:00 · 866 阅读 · 0 评论 -
二分查找题目:使结果不超过阈值的最小除数
如果除数大于等于最小除数,则除法结果之和小于等于阈值;如果除数小于最小除数,则除法结果之和大于阈值。判断除法结果之和是否小于等于阈值时,如果遍历尚未结束,除法结果之和就已经大于阈值,除法结果之和一定大于阈值,此时可以提前返回,不需要计算除法结果之和。为方便表述,下文使用「最小除数」表示使除法结果之和小于等于阈值的最小除数。作为除数,判断除法结果之和是否小于等于阈值,执行如下操作。如果除法结果之和小于等于阈值,则最小除数小于等于。时,除法结果之和一定不大于阈值,因此。,由此可以得到除法结果之和。原创 2024-12-16 18:00:00 · 879 阅读 · 0 评论 -
二分查找题目:在 D 天内送达包裹的能力
为了能在规定的天数内将传送带上的所有包裹送达,当运载能力确定时,每次装载应在不超过运载能力的前提下将装载的重量最大化。由于必须按照给定的顺序装载包裹,因此当给定包裹重量数组和运载能力时,可以遍历数组计算将传送带上的所有包裹送达需要的天数。如果实际运载能力大于等于最低运载能力,则将传送带上的所有包裹送达需要的天数小于等于。如果实际运载能力小于最低运载能力,则将传送带上的所有包裹送达需要的天数大于。天内将传送带上的所有包裹送达的船的最低运载能力。天内将传送带上的所有包裹送达的船的最低运载能力。原创 2024-12-12 18:00:00 · 1536 阅读 · 0 评论 -
二分查找题目:爱吃香蕉的珂珂
小时内吃掉所有香蕉,此时可以提前返回,不需要计算珂珂吃掉所有香蕉的总时间。根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。每个小时,她将会选择一堆香蕉,从这堆香蕉中吃掉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。由于珂珂在同一小时内最多吃一堆香蕉,因此。小时,由此可以得到珂珂吃掉所有香蕉的时间。作为珂珂吃香蕉的速度,判断珂珂是否可以在。珂珂可以决定她吃香蕉的速度为每小时吃。时,珂珂吃掉所有香蕉的时间小于等于。表示珂珂吃香蕉的速度,即每小时吃。时,珂珂吃掉所有香蕉的时间大于。原创 2024-12-09 18:00:00 · 688 阅读 · 0 评论 -
二分查找题目:搜索二维矩阵 II
这道题是「搜索二维矩阵」的进阶。这道题中的矩阵满足每行从左到右按升序排序且每列从上到下按升序排序,但是不满足每行的第一个整数大于前一行的最后一个整数,因此不能直接对整个矩阵二分查找。最朴素的解法是遍历整个矩阵寻找目标值。对于mmm行nnn列的矩阵,遍历的时间复杂度是OmnO(mn)Omn。利用矩阵的每一行和每一列有序的特点,可以降低时间复杂度。原创 2024-12-05 18:00:00 · 660 阅读 · 0 评论 -
二分查找题目:H 指数 II
利用数组有序的特点,可以使用二分查找计算 h 指数,时间复杂度是。根据 h 指数的定义,一名科研人员的 h 指数是指其发表的。分别表示二分查找的下标范围的下界和上界,初始时。有多种可能的值,其中最大的值作为 h 指数。单调递减,因此可以使用二分查找计算最大的。根据 h 指数的定义可知,在升序数组。,计算并返回该研究者的 h 指数。篇论文,每篇论文相应的被引用了。的平均数向下取整,执行如下操作。篇论文每篇被引用次数不超过。篇论文每篇至少被引用了。次,所以 h 指数是。篇论文被引用的次数,原创 2024-12-02 18:00:00 · 1061 阅读 · 0 评论 -
二分查找题目:寻找旋转排序数组中的最小值
此时二分查找的范围仅限于一个下标。由于被排除的下标都不可能是最小值所在下标,因此。为了寻找旋转排序数组中的最小值,需要得到旋转排序数组中的最小值所在下标。处的数,判断该数位于哪一个有序子数组中,调整查找的下标范围。由于数组中的所有整数各不相同,因此当最小值位于下标。分别表示二分查找的下标范围的下界和上界,初始时。由于被排除的下标都不可能是最小值所在下标,因此。分别为数组的最小下标和最大下标。,当该条件不成立时,二分查找结束,此时的。结束的有序子数组中,最小值位于下标。开始的有序子数组中,最小值位于下标。原创 2024-11-28 18:00:00 · 1048 阅读 · 0 评论 -
二分查找题目:搜索旋转排序数组
由于数组中的每个值各不相同,因此如果数组经过旋转,则旋转之后的数组的首元素一定大于末尾元素。对于数组中的任意数,可以根据该数与数组的首元素和末尾元素的大小关系得到其在哪个有序子数组中。将升序数组旋转之后得到的数组整体不是有序的,但是可以分成两个有序子数组,因此同样可以使用二分查找的方法查找目标值。处的数,判断该数是否等于目标值以及位于哪一个有序子数组中,调整查找的下标范围。否则,如果目标值存在,一定位于下标范围。,则如果目标值存在,一定位于下标范围。,则如果目标值存在,一定位于下标范围。原创 2024-11-25 18:00:00 · 1513 阅读 · 0 评论 -
二分查找题目:有序数组中的单一元素
对于只出现一次的元素,该元素的左边和右边各有偶数个元素。由于给定的数组长度是奇数,因此数组的最小下标和最大下标都是偶数,二分查找的下标范围的下界和上界的初始值分别为数组的最小下标和最大下标。由于只出现一次的元素的左边有偶数个元素,因此只出现一次的元素一定位于偶数下标,可以只在偶数下标中二分查找。二分查找过程中,每次更新后的下标范围的下界和上界都是偶数,确保只在偶数下标中二分查找。因此可以使用二分查找得到只出现一次的元素的下标。相同的元素下标判断只出现一次的元素位于下标。时,只出现一次的元素在下标。原创 2024-11-21 18:00:00 · 781 阅读 · 0 评论 -
二分查找题目:在排序数组中查找元素的第一个和最后一个位置
这道题要求在给定的数组中查找目标值的开始位置和结束位置。得到目标值的开始位置和结束位置之后(如果目标值不存在则开始位置和结束位置都是。分别表示二分查找的下标范围的下界和上界,对于每次二分查找,初始时。,此时不需要再次查找目标值的结束位置,而是可以直接返回。,则数组中不存在目标值,因此目标值的结束位置一定也是。处的数和目标值的大小关系,调整查找的下标范围。,则如果目标值存在,其开始位置大于等于。,则如果目标值存在,其开始位置大于。),返回目标值的开始位置和结束位置。时,才需要查找目标值的结束位置。原创 2024-11-18 18:00:00 · 995 阅读 · 0 评论 -
二分查找题目:第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错误的。实现一个函数查找第一个错误的版本。由于可以根据调用接口的结果缩小查找范围,因此可以使用二分查找得到。中的版本,使用该版本调用接口得到结果。如果该版本是错误的,则。,你想找出导致之后所有版本出错的第一个错误的版本。内,因此初始时二分查找的范围的下界和上界是。如果该版本是正确的,则。调用接口,根据结果调整二分查找的范围。是第一个错误的版本。原创 2024-11-14 18:00:00 · 1083 阅读 · 0 评论 -
二分查找题目:x 的平方根
牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),是牛顿提出的一种在实数域和复数域上近似求解方程的方法。当迭代次数达到预设的上限,或者相邻两次近似值足够接近时,即可结束迭代过程。牛顿迭代法的本质是使用泰勒级数,从初始近似值开始快速向函数的零点逼近。,此时会出现被零除的情况。的图像上的一点,过该点作函数图像的切线,切线方程是。内,因此初始时二分查找的范围的下界和上界是。的大小关系,调整二分查找的范围。的算术平方根的整数部分,则。原创 2024-11-11 18:00:00 · 1144 阅读 · 0 评论 -
二分查找题目:搜索二维矩阵
由于给定的矩阵满足每行升序排序,且每行的第一个整数大于前一行的最后一个整数,因此如果将矩阵的每一行拼接到前一行的末尾,可以得到一个升序数组,对应的矩阵行下标和列下标,判断矩阵中的相应位置的数和目标值的大小关系,调整查找的下标范围。为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。分别表示二分查找的下标范围的下界和上界,初始时。,则如果目标值存在,其下标一定小于。,则如果目标值存在,其下标一定大于。如果矩阵中相应位置的数等于。如果矩阵中相应位置的数大于。如果矩阵中相应位置的数小于。原创 2024-11-07 18:00:00 · 799 阅读 · 0 评论 -
二分查找题目:猜数字大小
由于可以根据猜测结果缩小猜数字的范围,因此可以使用二分查找得到。如果你猜错了,我会告诉你,你猜的数字比我所选的数字大还是小。并获得猜测结果,根据猜测结果调整二分查找的范围。每次猜数字之后可以获得猜测结果。内,因此初始时二分查找的范围的下界和上界是。你需要猜我选的是哪个数字。的平均数向下取整,猜数字。你调用一个预定义的接口。,需要在更小的数字中猜。,需要在更大的数字中猜。原创 2024-11-04 18:00:00 · 1654 阅读 · 0 评论 -
二分查找题目:搜索插入位置
这道题和「二分查找」大致相同,区别在于当数组中没有目标值时,不是返回−1-1−1,而是返回目标值在数组中的插入位置,使得插入目标值之后的数组仍然按升序排序。由于这道题和最简单的二分查找的区别只有没有找到目标值时的返回值,因此可以使用二分查找的做法,当没有找到目标值时将返回−1-1−1换成返回插入位置即可。假设目标值targettarget在数组numsnums中的插入位置是indexindex,则为了确保插入目标值之后的数组numsnums仍然按升序排序,应满足nums。原创 2024-10-31 18:00:00 · 653 阅读 · 0 评论 -
二分查找题目:二分查找
这道题是最简单的二分查找。给定的数组按升序排序,所有的元素各不相同,因此如果目标值存在则其下标唯一。用lowlow和highhigh分别表示二分查找的下标范围的下界和上界,初始时lowlow和highhigh分别为数组的最小下标和最大下标。每次查找时,取midmid为lowlow和highhigh的平均数向下取整,判断下标midmid处的数和目标值的大小关系,调整查找的下标范围。如果numsmidtargetnumsmidtarget,则找到目标值,其下标为。原创 2024-10-28 18:00:00 · 867 阅读 · 0 评论 -
二分查找的概念
由于二分查找的原理是根据当前查找的数与目标值的大小关系缩小查找的范围,因此可以使用二分查找的前提条件是单调性。第二种实现为在给定的数组中查找大于等于目标值的最小元素所在下标,当数组中的所有元素都小于目标值时返回数组长度。第三种实现为在给定的数组中查找小于等于目标值的最大元素所在下标,当数组中的所有元素都大于目标值时返回。是目标值可能存在的范围内的中间值,则经过一次查找可以将目标值可能存在的范围缩小一半。分别表示目标值可能存在的范围的下界和上界,初始时目标值可能存在的范围是整个数组,假设符合要求的最值是。原创 2024-10-24 18:00:00 · 850 阅读 · 0 评论
分享