二分查找的经典样例

本文探讨了排序数组中查找任务的核心——二分查找算法,将其应用于寻找元素的第一个和最后一个位置、搜索插入位置、求解平方根及判断完全平方数等问题。通过理解这些本质,可以轻松解决相关问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于查找任务来说,通常就是寻找目标值或者目标区间出现的位置。而看到排序数组+查找,第一反应就是二分查找。以下问题都可以直接转化到这个问题上来。

  • 34.在排序数组中查找元素的第一个和最后一个位置
    • 查找元素出现的第一个位置,等价于查找从这个数开始的区间。
    • 查找元素出现的最后一个位置,等价于查找以这个数结束的区间。
  • 35.搜索插入位置
    • 查找元素的插入位置,等价于查找从这个数开始的区间。
  • 69.x 的平方根
    • 查找x的平方根(向下取整),等价于查找从满足 a*a <= x 的最大整数 a 开始的区间。
  • 367.有效的完全平方数
    • 判断完全平方数,等价于查找是否存在一个数满足 a*a == x。
    • 当然也可以变成查找从满足 a*a <= x 的最大整数 a 开始的区间,然后判断这个 a 是否满足 a*a == x。
  • 704.二分查找
    • 标准的查找。
  • 剑指 Offer 53 - I.在排序数组中查找数字 I
    • 等价于34,将两个区间的边界相减即可。

搞清楚这些问题的本质,就很容易解决了。

### PTA 7-2 二分查找 实现解析 PTA 平台上的二分查找题目通常要求实现一个高效的搜索算法来定位目标值的位置。以下是基于站内引用的内容以及标准的二分查找实现方法。 #### 函数接口定义 函数 `Position BinarySearch(List L, ElementType X)` 的功能是从列表 `L` 中找到元素 `X` 所处的位置。如果存在多个相同的元素,则返回第一个匹配项的位置;如果没有找到该元素,则返回特殊标记 `-1` 表示未找到[^1]。 #### 算法描述 二分查找是一种针对有序数据集合的有效搜索技术,其时间复杂度为 \(O(\log n)\),适用于静态或动态数组中的快速查询操作。核心逻辑如下: 1. 定义两个指针分别指向待查区间的起始位置和结束位置。 2. 计算中间索引并比较中间值与目标值的关系。 3. 如果相等则直接返回当前位置;如果不等,则调整区间范围继续迭代直到满足条件或者超出边界为止。 下面是具体的代码实现方式之一(假设输入已经按升序排列好): ```c++ #include <iostream> using namespace std; typedef int Position; // 类型重命名方便理解 const Position NotFound = -1; int List[] = {1, 3, 5, 7, 9}; // 示列表 #define N sizeof(List)/sizeof(int) // 主体函数 Position BinarySearch(Position low, Position high, int key){ while (low <= high){ Position mid = low + ((high-low)>>1); // 防止溢出计算mid if(key == List[mid]) return mid; // 查找成功立即退出循环 else if(key < List[mid]) high=mid-1; // 调整右端点缩小范围 else low=mid+1; // 同理调整左端点扩大范围 } return NotFound; // 若遍历完成仍未发现key 返回NotFound标志位 } int main(){ cout<<BinarySearch(0,N-1,5)<<endl; // 测试 输出应为2 } ``` 上述程序展示了如何通过不断分割候选区域逐步逼近最终答案的过程,并且特别注意处理可能存在的极端情况比如空表或是单元素等情况下的行为表现^。 对于更复杂的场景如重复数值较多的大规模数据集上应用时还需要考虑其他优化策略如插值查找(interpolation search) 或者斐波那契查找(fibonacci search)[^2]^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值