You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GFG两数组元素计数场景下的二分查找逻辑咨询:自定义实现与参考实现的差异分析

你的二分查找实现问题分析与参考实现对比

咱们直接拆解你的原代码踩坑点,再对比参考实现的核心逻辑差异:

你的原实现的致命问题

  1. 数组越界风险
    代码里的判断条件b[mid+1]>x存在严重漏洞:当mid是数组最后一个元素(即mid = b_size-1)时,mid+1等于b_size,已经超出数组合法索引范围——比如当x大于等于数组所有元素时,必然触发越界操作,直接导致程序崩溃或未定义行为。

  2. 无返回值的未定义行为
    如果x比数组所有元素都大,或者数组只有一个元素且该元素<=x,你的循环内的return条件永远不会触发,循环结束后函数没有任何返回值,在C语言里这会返回随机垃圾值,完全不符合预期。

  3. 条件判断的局限性
    你的逻辑试图在循环内直接匹配“当前元素<=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)。

两者关键差异对比

维度你的实现参考实现
越界风险存在(访问mid+1)无(仅访问mid)
返回值完整性存在无返回的未定义行为循环结束后必返回h,逻辑完整
逻辑核心循环内直接匹配目标场景返回逐步缩圈,通过循环结束状态确定结果
边界场景处理遗漏x大于所有元素等边界情况完美覆盖所有边界场景

举个实际例子:当数组是[1,3,5,7],x=7时:

  • 你的实现最后mid会是3(最后一个元素),此时访问b[4]触发越界;
  • 参考实现会不断右移l,循环结束时h=3,正确返回最后一个元素的索引。

内容的提问来源于stack exchange,提问作者Mridul Adil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:55:51