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

已排序数组中bisect_left(arr, x)与bisect_right(arr, x-1)的相等条件问询

已排序数组中bisect_left(arr, x)与bisect_right(arr, x-1)的相等条件问询

嘿,这个问题问到点子上了!咱们得先把bisect_left和bisect_right的核心逻辑搞清楚,再看什么时候它们的结果一致,什么时候不一样~

先快速回顾下两个函数的行为(默认数组是升序排序的哈):

  • bisect_left(arr, x):返回数组中第一个大于等于x的元素的索引;如果所有元素都比x小,就返回数组的长度。
  • bisect_right(arr, x-1):返回数组中第一个大于x-1的元素的索引;如果所有元素都小于等于x-1,返回数组长度。

接下来分两种关键情况讨论:

情况1:数组中没有元素介于x-1和x之间

这种情况下,所有元素要么≤x-1,要么≥x。这时候:

  • 第一个大于x-1的元素,其实就是第一个≥x的元素(因为中间没有其他数值了)
  • 所以bisect_left(arr, x)和bisect_right(arr, x-1)的结果完全一致。

最典型的就是数组元素全是整数的场景——因为x-1和x之间没有整数,所以只要数组里都是整数,这两个函数的返回值一定相等。举个例子:
数组[1,3,5,7],x=4:

  • bisect_left(arr,4)找第一个≥4的元素是5,对应索引2;
  • bisect_right(arr,3)找第一个>3的元素是5,对应索引2,结果完全相等。

情况2:数组中存在元素介于x-1和x之间

这时候两者的结果就会不一样!比如数组里有某个元素y满足x-1 < y < x,那:

  • bisect_right(arr, x-1)会指向第一个这样的y的索引;
  • 而bisect_left(arr, x)会指向第一个≥x的元素的索引,这个位置在所有y元素的后面。

举个实际的非整数数组例子:
数组[1.5, 2.2, 2.8, 3.3],x=3(此时x-1=2):

  • bisect_left(arr,3)找第一个≥3的元素是3.3,对应索引3;
  • bisect_right(arr,2)找第一个>2的元素是2.2,对应索引1;
    很明显,3≠1,两个结果完全不同。

所以总结下来:这两个函数的返回值并不是在任何情况下都相等,只有当数组中不存在x-1和x之间的元素时,结果才会一致;如果有介于两者之间的元素,结果就会产生差异。

备注:内容来源于stack exchange,提问作者srm26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:48:01