
二分查找
与二分查找相关的知识的练习
Dearlingxx
记录自己的成长历程,欢迎一起讨论进步。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
借教室 二分答案 + 差分
1.当出现第一个不满足的订单后,后面的订单都是不满足的,所以可以通过二分答案找到第一个不满足的订单,因为每次都是从前往后借教室所以要把每次的操作存储一下。2.每次借用教室的时候对应区间的教室数量会减少是区间修改可以使用差分。原创 2024-07-28 11:43:35 · 214 阅读 · 0 评论 -
分巧克力 二分
思考可以发现当边长大于某一个值以后切出的巧克力数量都不满足,所以可以使用二分。原创 2024-07-28 12:04:57 · 181 阅读 · 0 评论 -
管道 蓝桥杯 二分答案 + 变种区间合并 + 很多细节
1.二分时mid的大小最大会来到 2 * r 的大小,当r很大计算时将 r 和 l 转化为long long 计算。1.从某一时刻之后整个管道都会被填满而之前就不会,发现答案具有二段性使用二分。2.判断已有水区间是否合并为一个且包含起始端点。原创 2024-07-28 13:41:56 · 249 阅读 · 0 评论 -
数的三次方根 浮点数二分
【代码】数的三次方根 浮点数二分。原创 2024-07-20 19:59:37 · 283 阅读 · 0 评论 -
数的范围 两种二分模板
用两种二分先找第一个x的位置再找第二个x的位置。原创 2024-07-20 19:48:25 · 213 阅读 · 0 评论 -
sum
二分的本质其实不是单调性,而是在一个范围内有一种性质,使得在某点的左边都满足而在某点的右边都不满足或者反过来,二分就可找到这样一个临界点左边界和右边界。原创 2024-07-20 19:15:07 · 197 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 有序数组中的单一元素
一种可行的思路是,考虑这个单独的数加入之前和加入之后这个数组中其他元素的属性发生了什么变化,不难看出在这个单独的数之前每一对数的第一个索引为偶数,在这个单独的数之后每一对数的第一个索引为奇数,由此便可以使用一个泛型二分查找得出答案。由此加上前面的二分题目可以看出,二分查找过程中 r 和 l 的更新情况是更具题目的具体情况而定的要结合具体的情景:多个数为整体,至少一次取出三个数等来正确地更新左右边界。这道题其实是将每一对数或者那一个单独的数看作整体,所以 r 和 l 的更新方式就和以往的不同。原创 2024-06-25 16:32:00 · 281 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 H指数II
这道题让我挣扎了一晚上,第二天终于让我发现了端倪。我认为这道题的一个关键在于发现两个h中一个h是主要的,主要的h是文章数第二的才是发表数,只需要找到的位置 i 上的值大于等于(citations.size()-i)文章数即是合法的一个位置在此位置之后找到的所有位置都是满足的,所以答案可能在这一位之前或者就是这一位,所以可以使用~01~泛型查找即可。题后反思:这里要根据题意注意二分查找失败的情况。原创 2024-06-25 16:16:50 · 298 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 山峰数组的峰顶索引
一种可行的方法是用一个普通的二分查找即可:每次取一个数索引为x同时可以得到索引为x+1和x-1的数,如果在山峰之前索引为x+1的数是这相邻的三个数中最大的调整l=mid,如果在山峰之后索引为x-1的值是这三个相邻的数中最大的调整r=mid,如果索引为x的数刚好是相邻三数中最大的即找到答案。r=mid,l=mid,因为山峰纯在于严格的相邻三数中,这样写能保证每次都够取出相邻的三个数。原创 2024-06-25 15:23:55 · 342 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 第k个缺失的正整数
和泛型二分查找一样,普通二分查找也有需要查找失败的情况。但是和泛型二分查找不同,查找结果在mid中而泛型二分查找结果在 l 和 r 中。只需要增大普通二分查找的 r l mid 的作用域即可。一种可行的办法是从1开始枚举num并不断在arr中二分查找该值,返回没有找到的第k个元素对应的num即可。原创 2024-06-24 22:58:55 · 295 阅读 · 0 评论 -
leetcode 二分查找·系统掌握
在阶梯数达到某一值后已有的硬币数量就小于了阶梯可以装的硬币数量,根据题意可以使用~10~泛型查找出最后一个可以被填满的阶梯。对于这类型可以二分答案的题目关键在于二分答案的上下界,本题的下界就是1上界就是硬币数量只有在1时等于阶梯数量其他时候一定小于等于硬币数。这道题让我看到了codefores上一类回合制打boss的问题,在某一回合后打的攻击就大于的boss的血量,通常就是需要找出这个临界位置,只需要注意二分查找的上下界,查找即可。原创 2024-06-23 11:50:35 · 157 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 x的平方根
这题可以使用~01~泛型查找在0~x/2的范围内查找答案。原创 2024-06-23 11:38:11 · 182 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 有效的完全平方数
就是一个非常普通的二分查找,但是需要注意的是查找的上下界,因为是完全平方,所以可以把上界设为这个数的一半,但是要特殊处理num等于1的时候。原创 2024-06-23 11:31:40 · 176 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 搜索二维矩阵
一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。原创 2024-06-23 00:37:38 · 169 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 第一个错误版本
就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。原创 2024-06-23 00:26:10 · 173 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 猜数字大小
使用最经典普通二分即可。原创 2024-06-21 13:48:37 · 271 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 寻找旋转排序数组中的最小值II
这会时原来的思路出现一个漏洞(大家感兴趣可以看看我做普通版寻找旋转排序数组最小值的思路),就是旋转后的数组中的第二个递增数组中可能出现等于旋转后数组的首元素,两个递增数组关于旋转后数组首元素nums[0]的关系变为,第一个递增数组大于等于nums[0],第二个递增数组小于等于nums[0]且等于的元素只会出现在第二个递增数组的尾部,一种可行的办法是预处理当第二个数组尾部元素等于nums[0]向前移动尾指针直到第二个递增数组中的值都小于nums[0]就可以使用之前的解法。原创 2024-06-21 13:45:46 · 457 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 寻找旋转排序最小值
本题和上一题非常相似。最小值只可能出现在数组头部(翻转为原数组)或者翻转后数组内部第二个递增数首元素。泛型二分~01~查找翻转后数组中第二个递增数组首元素,返回数组首元素和翻转后数组中第二个递增数组首元素中最小值即可。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。的数组,预先按照升序排列,经由。你必须设计一个时间复杂度为。原创 2024-06-20 14:48:28 · 253 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 搜索旋转排序数组
通过读题思考可以发现,旋转后的数组内部变为了两个递增数组。然后我们只需要在两个递增部分用最简单的二分查找即可,此时关键点就变成如何将找到数组内部两个递增数组交界的地方,观察思考发现,翻转后第一个元素就是第一个递增数组的第一个元素,在第一个递增数组后面的元素都大于它,而又因为这部分数组本来应该在原递增数组尾部,所以翻转后数组中第二个递增数组中的值都小于它这样就出现了一个~01~查找模型:查找第一个小于等于翻转后数组首元素,或者~10~模型:查找第一个大于等于翻转后数组首元素。,则返回它的下标,否则返回。原创 2024-06-20 14:43:01 · 163 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 寻找右区间
本题的查找的对象应该是所有的区间的start,在这个对象中要查找的值是大于等于当前区间end的值,因为要进行二分查找,所以就将所有区间的end单独拿出来排序以便进行二分查找。返回第一个键大于等于target的迭代器。做完这题让我思考,使用二分时需要明确二分查找的对象是谁,在这个对象中查找的值是谁。对于每个区间,只需查找是否有某个区间的start大于等于当前的区间的end即可。明白这样一个问题在写二分题目时,思路才会越来越来清晰。中对应下标组成的数组。原创 2024-06-19 11:44:58 · 191 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 在排序数组中查找元素的第一个和最后一个位置
为了解决这个问题,你需要检查你的代码,确保在进行加法操作时,不会发生溢出。报错原因是使用了未赋值的mid,但是根本原因是因为,没有了解到mid在普通二分查找和泛型二分~01~,~10~查找中的作用,在普通二分查找中,mid是二分查找最后的结果,而在泛型二分中,最终的结果并不存在于mid中而在l或者r中,而mid只是用于在泛型二分中调整r和l的值。为了解决这个问题,你需要检查你的代码,确保在访问vector的元素之前,vector已经被正确初始化并分配了内存空间。这个等号至关重要,泛型二分不能有等号。原创 2024-06-18 22:34:41 · 426 阅读 · 0 评论 -
leetcode 二分查找·系统掌握 统计有序矩阵中的负数
一种可行的解题思路是找出每一行中负数的个数再相加,又因为每一行单调递减,我们查找的又是负数,所以使用和上一题一样的泛型二分~01~模型,把每一行的结果相加即可。,矩阵中的元素无论是按行还是按列,都以非严格递减顺序排列。原创 2024-06-16 19:41:03 · 311 阅读 · 0 评论 -
二分查找 搜索插入位置
本题使用~01~型查找可以符合要求,但是本题有一个小细节,当插入的值比所有元素都要大时,应该插入到序列最后一个元素的后面,所以查找区间右边界的下标应该比数组右区间下标加一才能满足所有情况。读题发现要想实现本题的要求,需要使用二分查找的泛型查找。二分查找的泛型查找又分为~01~型和~10~型。当mid指向对象为1时,r=mid,当mid指向对象为0时,l=mid+1;当mid指向对象为1时,l=mid,当mid指向对象为0时,l=mid-1;~01~型:(左闭右闭)~10~型:(左闭右闭)原创 2024-06-15 10:49:50 · 254 阅读 · 0 评论 -
二分查找
这里采用左闭右闭的写法,定义三个指针分别指向待查找序列的起始位置(l),结束位置(r)和中间位置(mid),其中mid的公式为mid=(r+l)>>1(使用/2也行对于非负数>>1和/2是等价的都是除以2然后向下取整)。r的变换规则是当mid所对应的值大于要查找的target值时,r=f[mid]-1(这里二分查找的是target的位置对下边进行二分查找,要将查找到的下标对应回原数组判断该下标对应的值是否是target),l的变换规则是当mid所对应的值小于要查找的target值时,l=f[mid]+1;原创 2024-06-13 11:07:14 · 211 阅读 · 0 评论