二分查找算法入门
二分算法是算法题目中非常常见的一种优化手段,很好地体现了分治思想。无论是在算法竞赛还是实际工程中(如数据库索引、文件系统、游戏 AI 路径规划),二分都扮演着重要角色。
常见的二分场景主要包括二分答案、二分区间和二分浮点数。二分答案适用于在单调区间内寻找特定值;二分区间则用于搜索解的范围;二分浮点数处理精度问题,原理类似但实现细节不同。
基础二分查找
题目描述
给定一个升序整型数组 nums 和目标值 target,编写函数搜索 target。若存在返回下标,否则返回 -1。要求时间复杂度为 O(log n)。
示例:
输入:nums = [-1,0,3,5,9,12], target = 9
输出:4
解释:9 出现在 nums 中并且下标为 4
思路分析
定义左右指针 left 和 right,分别指向数组首尾。计算中间点 mid,根据 nums[mid] 与 target 的关系调整区间:
- 相等:找到目标,直接返回
mid。 - 大于:说明右半部分
[mid, right]均大于target,舍弃右侧,令right = mid - 1。 - 小于:说明左半部分
[left, mid]均小于target,舍弃左侧,令left = mid + 1。
循环条件通常为 while(left <= right),跳出时仍未找到则返回 -1。
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while (left <= right) {
// 防止溢出,等价于 (left + right) / 2
mid = left + (right - left + ) / ;
(nums[mid] < target)
left = mid + ;
(nums[mid] > target)
right = mid - ;
mid;
}
;
}
};


