算法选择题:二分查找(5 题)
031 二分查找能够成立的必要条件是什么?
难度: 基础
- A. 任何整数答案都可以直接二分
- B. 二分查找要求数组必须无序,否则结果不唯一
- C. 二分只适用于数组,不适用于答案值域搜索
- D. 判定结果在搜索空间中必须单调,方向只变化一次;搜索空间不一定是数组,但必须能证明单调阈值
查看答案与解析
正确答案D
正确原因: 二分要求判定结果在搜索空间中只发生一次方向变化;搜索空间不一定是数组,但必须能证明单调阈值。
错误选项辨析: A 项:答案可二分的前提是判定结果单调,否则无法确定移动方向;B 项:二分恰恰要求有序或单调的判定,无序无法二分;C 项:对答案空间二分是常见技巧,搜索空间不一定是有序数组。
032 在闭区间 [left,right] 上做二分查找,哪种写法表述准确?
难度: 进阶
给定代码:
int left = 0, right = a.Length - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (a[mid] < target) left = mid + 1;
else if (a[mid] > target) right = mid - 1;
else return mid;
}
return -1;
- A. 闭区间下循环条件应为 left <= right;检查 mid 后必须用 mid+1 或 mid-1 排除 mid,否则可能死循环
- B. mid 必须写成 (left + right) / 2 才能保证正确
- C. 循环条件应写成 left < right,且更新时保留 mid
- D. 闭区间下 right 应初始化为 a.Length,才能覆盖最后一个元素
查看答案与解析
正确答案A
正确原因: 区间 [left,right] 非空条件是 left <= right;检查 mid 后必须用 mid-1 或 mid+1 排除它。
错误选项辨析: B 项:left + (right-left)/2 同样正确,且能避免相加溢出;C 项:与闭区间语义矛盾,保留 mid 会导致无法排除已检查位置;D 项:闭区间包含 right,初始化为 Length 会越界访问。
033 在半开区间 [left,right) 上做二分查找,哪种表述准确?
难度: 进阶
- A. 闭区间与半开区间的更新规则可以任意混用
- B. 半开区间的循环条件必须写成 left <= right
- C. right 可初始化为 Length;循环条件为 left < right;更新必须始终保持右端不包含语义,即 right=mid、left=mid+1
- D. 半开区间下 right 必须初始化为 Length-1
查看答案与解析
正确答案C
正确原因: 区间 [left,right) 可把 right 初始化为 Length;循环和更新必须始终保持右端不包含语义。
错误选项辨析: A 项:混用会破坏区间语义,导致漏查或死循环;B 项:半开区间空条件为 left == right,写成 <= 会越界;D 项:半开区间不包含右端,初始化为 Length 才能覆盖全部元素。
034 计算二分中点时,为什么常用 left + (right - left) / 2?
难度: 进阶
- A. 避免 left + right 直接相加溢出;下标与答案范围仍需选择足够宽的整数类型
- B. (left + right) / 2 在所有范围都安全,无需改写
- C. 只要用 long 保存 mid,就一定能避免所有溢出问题
- D. left + (right - left) / 2 只有在 left 为负数时才有效
查看答案与解析
正确答案A
正确原因: 使用 left + (right-left)/2 避免直接相加溢出;下标与答案范围仍需选择足够宽的整数类型。
错误选项辨析: B 项:left+right 可能超过 int 上限,直接相加会溢出;C 项:若 left+right 先以 int 计算,赋值 long 前已经溢出;D 项:该写法对任意 left、right 都成立,与正负无关。
035 在有序数组中查找第一个 >= target 的位置,哪种表述准确?
难度: 综合
- A. 下界一定返回 target 的首次出现位置,找不到 target 就返回 -1
- B. 下界(lower bound)返回第一个 >= target 的位置,上界(upper bound)返回第一个 > target 的位置;不存在符合位置时都可能返回 Length
- C. 上下界都等价于查找任意一个 target 的位置
- D. 下界只在数组包含 target 时才有意义,否则结果恒为 0
查看答案与解析
正确答案B
正确原因: 下界找第一个 >= target,上界找第一个 > target;不存在符合位置时二者都可能返回 Length。
错误选项辨析: A 项:下界在 target 不存在时返回第一个大于它的位置,而不是 -1;C 项:下界找边界位置而非任意命中,没有 target 时仍返回插入点;D 项:target 不存在时下界返回插入点,取决于数组内容而非恒为 0。