1.认识二分查找
二分查找的时间复杂度:O(logN)
二分查找属于算法中耳熟能详的一类,通常的我们会说只有数组有序才可以使用二分查找,不过这种说法并不完全正确,只要数据具有"二段性"就可以使用二分查找,即我们可以找出一种规律将数据分为两部分,然后以此类推处理整个数据即可
二分查找有三种模版:1.朴素二分查找 2.查找左边界的二分查找 3.查找右边界的二分查找
我们这里首先介绍最简单的朴素二分查找,通常朴素二分查找的模版如下
int left = 0,right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left) / 2;//防止数据溢出
if(......)
{
right = mid - 1;
}
else if(......)
{
left = mid + 1;
}
else
{
return ......;
}
}
2.实战练习
题目来源:704.二分查找——力扣
这里的数组默认有序,所以这里的"二段性"是将数组分为比target大和比target小两个区间,然后逐区间处理即可
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(target < nums[mid])
{
right = mid - 1;
}
else if(target > nums[mid])
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
};