二分查找的区间定义
- 左开右开
(left,right) - 左闭右闭
[left,right] - 左开右闭
(left,right] - 左闭右开
[left,right)
通常来说,我们一般会选择【左闭右开】或者【左闭右闭】的区间定义。
左闭右闭区间
- 定义:搜索区间包括 left 和 right,即 left 和 right 都可能是目标值。
- 退出条件:
left > right,表示搜索区间为空。 - 左闭右闭区间的二分查找的常见写法如下:
while (left <= right) { // 注意是 <=
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1; // [mid+1, right]
} else {
right = mid - 1; // [left, mid-1]
}
}左闭右开区间
- 定义:搜索区间包括 left 但不包括 right,即目标值可能是 left,但不可能是 right。
- 退出条件:当 left == right 时,表示搜索区间为空。
- 左闭右开区间的二分查找的常见写法如下:
while (left < right) { // 注意是 <
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1; // [mid+1, right)
} else {
right = mid; // [left, mid)
}
}