GFG两数组元素计数场景下的二分查找逻辑咨询:自定义实现与参考实现的差异分析
你的二分查找实现问题分析与参考实现对比
咱们直接拆解你的原代码踩坑点,再对比参考实现的核心逻辑差异:
你的原实现的致命问题
数组越界风险
代码里的判断条件b[mid+1]>x存在严重漏洞:当mid是数组最后一个元素(即mid = b_size-1)时,mid+1等于b_size,已经超出数组合法索引范围——比如当x大于等于数组所有元素时,必然触发越界操作,直接导致程序崩溃或未定义行为。无返回值的未定义行为
如果x比数组所有元素都大,或者数组只有一个元素且该元素<=x,你的循环内的return条件永远不会触发,循环结束后函数没有任何返回值,在C语言里这会返回随机垃圾值,完全不符合预期。条件判断的局限性
你的逻辑试图在循环内直接匹配“当前元素<=x且下一个元素>x”的场景才返回,但这只是目标位置的一种情况(x处于数组中间),完全遗漏了x大于所有元素、x等于最后一个元素等边界场景。
参考实现的核心逻辑
参考实现的思路是逐步缩小搜索范围,通过循环结束后的状态确定结果,完美规避了上述问题:
- 只要
arr[mid] <= x,说明还能往右寻找更大的符合条件的元素,因此将左边界l移到mid+1; - 如果
arr[mid] > x,说明目标位置在左侧,将右边界h移到mid-1; - 循环结束时,
l一定大于h,此时h就是最后一个满足arr[h] <= x的元素索引:- 若x比所有元素都小,
h会变成-1(合理,无符合条件的元素); - 若x比所有元素都大,
h会停在数组最后一个索引(正确,最后一个元素<=x)。
- 若x比所有元素都小,
两者关键差异对比
| 维度 | 你的实现 | 参考实现 |
|---|---|---|
| 越界风险 | 存在(访问mid+1) | 无(仅访问mid) |
| 返回值完整性 | 存在无返回的未定义行为 | 循环结束后必返回h,逻辑完整 |
| 逻辑核心 | 循环内直接匹配目标场景返回 | 逐步缩圈,通过循环结束状态确定结果 |
| 边界场景处理 | 遗漏x大于所有元素等边界情况 | 完美覆盖所有边界场景 |
举个实际例子:当数组是[1,3,5,7],x=7时:
- 你的实现最后mid会是3(最后一个元素),此时访问
b[4]触发越界; - 参考实现会不断右移
l,循环结束时h=3,正确返回最后一个元素的索引。
内容的提问来源于stack exchange,提问作者Mridul Adil
相关产品推荐
相关产品推荐

