基础二分查找
二分查找的核心在于维护一个搜索区间 [left, right]。初始时指向数组两端,每次取中间点 mid,根据 nums[mid] 与目标值 target 的关系缩小范围。
实现要点:
- 指针定义:
left指向左边界,right指向右边界。 - 循环条件:通常使用
while(left <= right),确保区间内所有元素都被检查过。 - 防止溢出:计算中点时避免
(left + right) / 2,推荐使用left + (right - left) / 2。 - 区间收缩:若
nums[mid] > target,说明目标在左侧,更新right = mid - 1;反之更新left = mid + 1。
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;
}
};
寻找左右边界
当数组中存在重复元素时,我们需要找到目标值的第一个和最后一个位置。这本质上是两次二分查找,分别寻找左边界和右边界。
寻找左边界
左边界的特点是:左侧区间都小于目标值,右侧区间(含边界)大于等于目标值。
- 若
nums[mid] >= target,说明mid可能是结果或结果在左侧,保留 ,令 。

