news 2026/6/22 16:12:17

二分查找算法 为啥左闭右闭 right = mid -1; 左闭右开为right = mid

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分查找算法 为啥左闭右闭 right = mid -1; 左闭右开为right = mid

这是二分查找里最核心的内容之一。

关键不是「左闭右闭」还是「左闭右开」,而是:

mid 是否已经被证明不可能是答案。


左闭右闭[left, right]

区间定义:

[left, right]

表示:

left 和 right 都是可能答案

例如:

left = 0; right = n - 1;

假设我们在找:

第一个 >= target 的位置

当:

nums[mid] >= target

时,说明:

mid 可能就是答案

例如:

nums = [1,2,2,2,5] target = 2

第一次:

mid = 2 nums[2] = 2

此时:

mid 可能是第一个2吗?

不知道。

因为左边还有:

nums[1] = 2

所以我们要继续往左找。

但是:

mid 本身不能丢

理论上应该写:

right = mid;

但是如果这样写:

while(left <= right)

可能死循环。

例如:

left = 1 right = 1 mid = 1

执行:

right = mid;

得到:

left = 1 right = 1

区间没缩小。

永远循环。


因此左闭右闭模板必须:

right = mid - 1;

把 mid 排除掉。

虽然排除了 mid,

但别忘了:

return left;

最终 left 会停在第一个满足条件的位置。


左闭右开[left, right)

区间定义:

[left, right)

右边界不属于搜索区间。

例如:

left = 0; right = n;

循环:

while(left < right)

当:

nums[mid] >= target

时:

mid 可能是答案

所以不能丢。

写:

right = mid;

为什么不会死循环?

因为这里区间是:

[left,right)

假设:

left = 3 right = 4

则:

mid = 3

执行:

right = mid;

得到:

left = 3 right = 3

此时:

left < right

已经不成立。

循环结束。

不会死循环。


本质区别

左闭右闭:

区间包含 right

所以:

right = mid

可能导致区间大小不变。

必须:

right = mid - 1

保证缩小。


左闭右开:

区间不包含 right

所以:

right = mid

已经缩小了区间。

因为:

[mid,right) → [mid,mid)

区间长度直接变成 0。


用图理解

假设:

left=3 right=4 mid=3

左闭右闭:

[3,4] ^ mid

执行:

right = mid;

得到:

[3,3]

下一轮还是:

mid=3

可能卡住。

所以要:

right = mid - 1;

变成:

[3,2]

循环结束。


左闭右开:

[3,4) ^ mid

执行:

right = mid;

得到:

[3,3)

区间为空。

直接结束。


所以可以记住:

区间循环条件左移右边界
[left,right]left <= rightright = mid - 1
[left,right)left < rightright = mid

原因是:

  • 左闭右闭中,mid仍在区间内,必须用-1保证区间缩小。
  • 左闭右开中,right本来就不在区间内,right = mid已经完成缩小,同时保留了mid作为候选答案。

这也是为什么你现在的findFirst()

while (left <= right) { ... if (nums[mid] < target) left = mid + 1; else right = mid - 1; } return left;

能够正确返回第一个 ≥ target 的位置(lower_bound)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 9:40:55

2026必看:个人开发者高性价比AI编程工具推荐

个人做副业产品&#xff0c;从零写代码效率太低怎么办&#xff1f;预算有限&#xff0c;想找能覆盖从想法到上线全流程的AI编程工具怎么选&#xff1f;这是很多独立开发者、自由职业者最常遇到的问题。我作为深度实测过多款工具的独立开发者&#xff0c;结合单兵作战、快速试错…

作者头像 李华
网站建设 2026/6/20 10:12:37

Python-100-Days:18万Star的Python系统学习路线

文章目录Python-100-Days&#xff1a;18万Star的Python系统学习路线Python-100-Days&#xff1a;18万Star的Python系统学习路线 如果你想学Python却不知道从何开始&#xff0c;这个项目几乎是所有学习者都会参考的资源。它在GitHub上积累了超过18万Star&#xff0c;作者是骆昊…

作者头像 李华
网站建设 2026/6/20 10:12:23

2026年惠州知名纸托定制厂家大揭秘,哪家才是你的理想之选?

根据行业统计数据&#xff0c;在纸托定制领域&#xff0c;很多企业面临着环保要求高、定制化难、品质不稳定等问题&#xff0c;每年给企业造成 20%左右的成本浪费。解决这些问题的关键在于选择一家专业且实力雄厚的纸托定制厂家。如惠州市宇泰包装制品有限公司&#xff08;位于…

作者头像 李华
网站建设 2026/6/20 10:21:58

Python实现窗体编程的五大主流技术与方法详解

Python提供了多种实现图形用户界面(GUI)编程的技术,本文将详细介绍五种主流技术,并提供示例代码和优劣分析,希望对大家有一定的帮助。 Python提供了多种实现图形用户界面(GUI)编程的技术&#xff0c;下面我将详细介绍几种主流技术&#xff0c;并提供示例代码和优劣分析。 1 Tki…

作者头像 李华