参考资料: 博主Charon_cc,二分查找
概念
- 概念:快速遍历数组元素查找所需元素,通过比较目标值与数组中间值大小,修改待查的数组区间和中间值,算法每次排除掉至少一半的待查数组
- 条件:数组有序
- 时间复杂度:O(logn)
- 其他:
- 若数组有重复元素,则返回结果不唯一
- 核心在于每次排除掉至少一半的待查数组,而与目标值进行比较只是为了达到该目的
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 二分查找 时间复杂度 O(logn)
// 区间范围 与 循环条件 两者相互联系影响
// [left, right] 为区间范围
int binary_search(vector<int> &nums, int target)
{
// right 为索引值 需长度-1
int left = 0, right = nums.size() - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if (nums.at(middle) == target)
return middle;
else if (nums.at(middle) > target)
right = middle - 1;
else if (nums.at(middle) < target)
left = middle + 1;
}
return -1;
}
// [left, right) 为区间范围
// while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
int binary_search_02(vector<int> &nums, int target)
{
int left = 0, right = nums.size();
while (left < right)
{
int middle = (left + right) / 2;
if (nums.at(middle) == target)
return middle;
else if (nums.at(middle) > target)
right = middle;
else if (nums.at(middle) < target)
left = middle + 1;
}
return -1;
}
// 测试
int main()
{
vector<int> nums = {-1, 0, 3, 5, 9, 12};
auto result = binary_search_02(nums, 13);
cout << result << endl;
}
图解