# 第 7 节 while (left < right) 一定表示左闭右开吗?

网上有教程提到 while (left < right) 表示定义的搜索区间 [left..right) 左闭右开区间,这种说法不完全正确。while 里面的条件只表示什么时候循环终止。

「左闭右开」还是「左闭右闭」这一点 完全由编码的人决定。其实「左闭右闭」还是「左闭右开」是一件很简单的事情,下面我们分别进行说明。

把区间定义成 [left..right) 不会给解决「二分查找」问题带来任何帮助,反而会使得解决问题变得复杂。

提示:这里我们要纠正一件事情,不是因为循环可以继续的条件写成 while (left < right) ,表示搜索区间为 [left..right) ,而是因为定义了搜索区间为 [left..right) ,当 leftright 重合的时候,区间 [left..right) 为空区间,所以循环可以继续的条件是 while (left < right)

# 什么是「左闭右闭」

如果我们要找的元素的范围在区间 [1..10] ,我们设置 left = 1right = 10,表示设置的区间为左闭右闭区间,这一点其实很自然。

# 什么是「左闭右开」

如果我们要找的元素的范围在区间 [1..10] ,我们设置 left = 1right = 11,表示设置的区间为左闭右 区间。因为「右开」,11 不能取到,实施上仍然表示要找的元素的范围在区间 [1..10]

这一点其实是为了说明「循环不变量」而引入的例子。把循环不变量定义成「左闭右开」区间其实对求解「二分查找」的问题没有帮助。

提示:「二分查找」不会因为我们把区间定义成「左闭右开」区间而变得简单,只有我们真正理解题目中给出单调性或者可以逐步缩小区间的理由,才能够正确写出「二分查找」的代码。

复习「循环不变量」:「循环不变量」其实说的是一件很简单的事情:在循环的每一轮对于变量的定义必须一致。循环不变量我专门录制了视频、编写了文字进行说明,可以看 这里 (opens new window)

# 使用「二分查找」解决的问题应该做好以下几点

  • 分析题意,再次强调审题、认真看题非常重要;
  • 分析出题目中隐含的单调性;
  • 根据题意,分析清楚什么时候猜的 mid 的值可能是解,什么时候猜的 mid 的值一定不是解;
  • 下一轮搜索应该在 mid 的左边还是右边继续查找。

作者:liweiwei1419 链接:https://suanfa8.com/binary-search/left-closed-right-open 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/18/2024, 11:23:03 PM