二分查找算法详解与实战题解
二分查找是处理有序数据最经典的算法之一。掌握其核心思想——利用数据的二段性不断缩小搜索区间,不仅能解决基础查找问题,还能应对边界定位、插入位置、极值寻找等多种变体。下面通过七道典型题目,结合 C++ 代码实战,梳理关键逻辑与易错点。
1. 标准二分查找
思路解析:
定义左右指针 left 和 right,分别指向数组首尾。每次计算中间点 mid,根据 nums[mid] 与目标值 target 的大小关系决定舍弃左半部分还是右半部分:
- 若相等,直接返回索引;
- 若
nums[mid] > target,说明目标在左侧,更新right = mid - 1; - 若
nums[mid] < target,说明目标在右侧,更新left = mid + 1。 当left > right时仍未找到,返回 -1。
注意: 计算 mid 时使用 left + (right - left) / 2 可避免整数溢出。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid - 1;
else return mid;
}
return -1;
}
};
2. 查找元素的第一个和最后一个位置
思路解析: 此题需要找到目标值的左右边界。核心在于构造不同的判断条件来收缩区间。
寻找左边界:
目标是找到第一个等于 target 的位置。此时将区间分为两段:小于 target 的左侧,大于等于 target 的右侧。当 nums[mid] >= target 时,mid 可能是结果或结果在左侧,故 ;否则 。注意此处 需向下取整,防止死循环。

