二分查找算法简介
二分查找(Binary Search),也称为折半查找,是一种高效的有序数组查找算法。其核心思想是通过不断将搜索区间减半,快速缩小目标值的可能范围,最终找到目标值或确定其不存在。该算法的时间复杂度为 O(log n),远优于顺序查找的 O(n),在处理大规模有序数据时优势显著。
题目一:二分查找
题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目示例: 输入:nums = [-1,0,3,5,9,12], target = 9 输出:4 解释:9 出现在 nums 中并且下标为 4
解法:
算法流程:
- 定义 left,right 指针,分别指向数组的左右区间。
- 找到待查找区间的中间点 mid,找到之后分三种情况讨论:
- arr[mid] == target:说明正好找到,返回 mid 的值;
- arr[mid] > target:说明 [mid, right] 这段区间都是大于 target 的。因此舍去右边区间,往左边 [left, mid-1] 的区间继续查找,即让 right=mid-1,然后重复步骤 2;
- arr[mid] < target:说明 [left, mid] 这段区间的值都是小于 target 的。因此舍去左边区间,在右边 [mid+1, right] 区间继续查找,即让 left=mid+1,然后重复步骤 2。
- 当 left 与 right 错开时,说明整个区间都没有这个数,返回 -1。
C++ 算法代码:
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;
}
};
二分查找算法模板:
left = , right = nums.() - ;
(left <= right) {
mid = left + (right - left) / ;
(条件判断) left = mid + ;
(条件判断) right = mid - ;
结果;
}


