二分查找模板分析

模板说明:


你在网上看到的 99% 的二分查找问题会归结于这 3 个模板中的一个。有些问题可以使用多个模板来实现,但是当你做更多的练习时,你会注意到一些模板比其他模板更适合某些问题。

注意:模板和它们的差异已被彩色标注如下。

这 3 个模板的不同之处在于:

  • 左、中、右索引的分配。
  • 循环或递归终止条件。
  • 后处理的必要性。

模板 #1 和 #3 是最常用的,几乎所有二分查找问题都可以用其中之一轻松实现。模板 #2 更 高级一些,用于解决某些类型的问题。

这 3 个模板中的每一个都提供了一个特定的用例:

 

模板 #1 (left <= right):


  • 二分查找的最基础和最基本的形式。
  • 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。
  • 不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。

 

模板 #2 (left < right):


  • 一种实现二分查找的高级方法。
  • 查找条件需要访问元素的直接右邻居。
  • 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。
  • 保证查找空间在每一步中至少有 2 个元素。
  • 需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件。

 

模板 #3 (left + 1 < right):


  • 实现二分查找的另一种方法。
  • 搜索条件需要访问元素的直接左右邻居。
  • 使用元素的邻居来确定它是向右还是向左。
  • 保证查找空间在每个步骤中至少有 3 个元素。
  • 需要进行后处理。 当剩下 2 个元素时,循环 / 递归结束。 需要评估其余元素是否符合条件。

 

时间和空间复杂度:


时间:O(log n) —— 算法时间

因为二分查找是通过对查找空间中间的值应用一个条件来操作的,并因此将查找空间折半,在更糟糕的情况下,我们将不得不进行 O(log n) 次比较,其中 n 是集合中元素的数目。

为什么是 log n?

  • 二分查找是通过将现有数组一分为二来执行的。
  • 因此,每次调用子例程(或完成一次迭代)时,其大小都会减少到现有部分的一半。
  • 首先 N 变成 N/2,然后又变成 N/4,然后继续下去,直到找到元素或尺寸变为 1
  • 迭代的最大次数是 log N (base 2) 。

 

空间:O(1) —— 常量空间


虽然二分查找确实需要跟踪 3 个指标,但迭代解决方案通常不需要任何其他额外空间,并且可以直接应用于集合本身,因此需要 O(1) 或常量空间。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找模板题是一种常见的算法题,可以通过二分查找的思想来解决。在给定的代码中,使用了二分查找来寻找满足条件的最小值K。具体的实现步骤如下: 1. 首先定义一个函数check,用于检查在字符串s中长度为mid的所有子串是否是不重复的。在函数内部,使用unordered_set来存储已经出现过的子串,如果出现重复,则返回false,否则返回true。 2. 在主函数中,使用二分查找的方式来寻找最小的满足条件的K。初始化左边界l为1,右边界r为100。在while循环中,每次取中间值mid,并调用check函数来判断是否满足条件。 3. 如果check函数返回true,说明当前的K满足条件,将右边界r更新为mid,继续在左半部分寻找更小的值。 4. 如果check函数返回false,说明当前的K不满足条件,将左边界l更新为mid+1,继续在右半部分寻找满足条件的值。 5. 当左边界l和右边界r相等时,循环结束,此时的l即为最小的满足条件的K。 所以,给定的代码实现了一个二分查找模板题,使用C++语言编写。它通过判断字符串中长度为mid的子串是否重复来寻找最小的满足条件的K值。 #### 引用[.reference_title] - *1* [推荐使用的二分查找模板](https://blog.csdn.net/justidle/article/details/104527596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [二分查找例题与模板(蓝桥杯复习+例题讲解+模板c++)](https://blog.csdn.net/jj6666djdbbd/article/details/129773547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值