二分查找核心逻辑与实战
二分查找是算法面试中的高频考点,其核心在于利用数据的有序性,将查找范围不断减半。掌握二分查找不仅要求会写代码,更要理解边界处理、溢出风险以及不同变体下的区间收缩策略。
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 而非 (left + right) / 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。

