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;}
};