简要介绍
二分算法是解决有序数据检索问题的利器,其核心思想是分治。无论是在算法竞赛还是实际工程中(如数据库索引、文件系统),二分法都扮演着重要角色。常见的二分场景包括二分答案、二分区间和二分浮点数。
二分答案:在具有单调性的区间内寻找特定值,通过不断调整查找范围逼近目标。 二分区间:搜索满足条件的区间边界,常用于查找解的范围。 二分浮点数:处理精度要求较高的数值问题,逻辑与二分答案类似但需关注终止条件。
相关例题
1. 二分查找
题目描述
给定一个升序整型数组 nums 和一个目标值 target,编写函数搜索 target。若存在返回下标,否则返回 -1。要求时间复杂度为 O(log n)。
示例 1:
输入:nums = [-1,0,3,5,9,12], target = 9
输出:4
解释:9 出现在 nums 中且下标为 4
示例 2:
输入:nums = [-1,0,3,5,9,12], target = 2
输出:-1
解释:2 不存在于 nums 中
实现思路
定义左右指针 left 和 right,分别指向数组首尾。计算中间点 mid,根据 nums[mid] 与 target 的关系收缩区间:
- 若
nums[mid] == target,直接返回mid。 - 若
nums[mid] > target,说明目标在左半部分,更新right = mid - 1。 - 若
nums[mid] < target,说明目标在右半部分,更新left = mid + 1。
循环条件为 while(left <= right),跳出时仍未找到则返回 -1。
实现代码
class Solution {
public:
int search(vector<int>& nums, target) {
n = nums.();
left = , right = n - ;
(left <= right) {
mid = left + (right - left + ) / ;
(nums[mid] < target)
left = mid + ;
(nums[mid] > target)
right = mid - ;
mid;
}
;
}
};


