二分查找算法详解与实战模板
二分查找是有序数组中的核心搜索算法,其本质是通过不断折半缩小搜索范围,直到找到目标元素。虽然最朴素的使用场景是在升序数组中查找指定值,但通过调整边界策略,它可以解决更复杂的问题,如查找区间、峰值元素等。
1. 基础二分查找
我们先从经典的 LeetCode 704 题入手,巩固最朴素的二分查找逻辑。
题目描述
给定一个升序数组 nums 和一个目标值 target,找出 target 在数组中的下标。如果不存在则返回 -1。
实现思路
初始化两个指针 left 和 right,分别指向数组首尾。计算中间位置 mid,比较 nums[mid] 与 target:
- 若
nums[mid] > target,说明目标在左半部分,将right移至mid - 1。 - 若
nums[mid] < target,说明目标在右半部分,将left移至mid + 1。 - 若相等,直接返回
mid。
循环终止条件为 left <= right。当 left > right 时仍未找到,说明目标不存在。
注意: 计算 mid 时,直接使用 (left + right) / 2 在数组极长时可能导致整数溢出。建议使用 left + (right - left) / 2 或 left + (right - left + 1) / 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) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
;
}
};


