算法笔记(二)——二分查找算法
二分查找(Binary Search)是一种在有序数组中查找特定元素的算法。该算法的基本思想是通过每一次比较,将查找范围缩小一半,最终找到目标元素或者确定目标元素不存在。
步骤:
- 初始化两个指针````````和
r
分别指向区间的开始和终点; while(l< r)
计算中点mid = (l+ r)/ 2
(有溢出的风险),防止溢出的方法mid = (r- l) / 2 + l
- 判断
mid
处是否满足条件; - 如果目标元素等于中间元素,查找成功,返回中间元素的索引。
- 如果目标元素小于中间元素,说明目标元素可能在左半部分,更新
r= mid - 1
- 如果目标元素大于中间元素,说明目标元素可能在右半部分,更新
l= mid + 1
优势:
- 因为每次可以减少一半的查询量,所以时间复杂度低,为
O(logN)
条件:
- 数组必须有序;
版本1:
当我们将区间[l, r]
划分成[l, mid]
和[mid + 1, r]
时,其更新操作是r = mid
或者l = mid + 1
;,计算mid
时不需要加1。
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
版本2
当我们将区间[l, r]
划分成[l, mid - 1]
和[mid, r]
时,其更新操作是r = mid - 1
或者l = mid
;,此时为了防止死循环,计算mid
时需要加1。
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
二分查找
题目链接:二分查找
思路:
- 最基础的二分,按照上述步骤写即可;
C++代码
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int l = 0, r = nums.size() - 1;
while(l <= r)
{
int mid = l + r >> 1;
if(nums[mid] > target)
{
r = mid - 1;