# 第 7 节 while (left < right) 一定表示左闭右开吗?
网上有教程提到 while (left < right)
表示定义的搜索区间 [left..right)
左闭右开区间,这种说法不完全正确。while
里面的条件只表示什么时候循环终止。
「左闭右开」还是「左闭右闭」这一点 完全由编码的人决定。其实「左闭右闭」还是「左闭右开」是一件很简单的事情,下面我们分别进行说明。
把区间定义成 [left..right)
不会给解决「二分查找」问题带来任何帮助,反而会使得解决问题变得复杂。
提示:这里我们要纠正一件事情,不是因为循环可以继续的条件写成
while (left < right)
,表示搜索区间为[left..right)
,而是因为定义了搜索区间为[left..right)
,当left
与right
重合的时候,区间[left..right)
为空区间,所以循环可以继续的条件是while (left < right)
。
# 什么是「左闭右闭」
如果我们要找的元素的范围在区间 [1..10]
,我们设置 left = 1
,right = 10
,表示设置的区间为左闭右闭区间,这一点其实很自然。
# 什么是「左闭右开」
如果我们要找的元素的范围在区间 [1..10]
,我们设置 left = 1
,right = 11
,表示设置的区间为左闭右 开 区间。因为「右开」,11
不能取到,实施上仍然表示要找的元素的范围在区间 [1..10]
这一点其实是为了说明「循环不变量」而引入的例子。把循环不变量定义成「左闭右开」区间其实对求解「二分查找」的问题没有帮助。
提示:「二分查找」不会因为我们把区间定义成「左闭右开」区间而变得简单,只有我们真正理解题目中给出单调性或者可以逐步缩小区间的理由,才能够正确写出「二分查找」的代码。
复习「循环不变量」:「循环不变量」其实说的是一件很简单的事情:在循环的每一轮对于变量的定义必须一致。循环不变量我专门录制了视频、编写了文字进行说明,可以看 这里 (opens new window)。
# 使用「二分查找」解决的问题应该做好以下几点
- 分析题意,再次强调审题、认真看题非常重要;
- 分析出题目中隐含的单调性;
- 根据题意,分析清楚什么时候猜的
mid
的值可能是解,什么时候猜的mid
的值一定不是解; - 下一轮搜索应该在
mid
的左边还是右边继续查找。
作者:liweiwei1419 链接:https://suanfa8.com/binary-search/left-closed-right-open 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。