二分查找适用于单调、存在上下界的线性序列,是最快的搜索算法。
递归实现
int bin_search(vector<int> v, int left, int right, int target)
{
if (left > right)
return -1;
int mid = left + (right - left) / 2;
if (v[mid] == target)
{
return mid;
}
else if (v[mid] > target)
{
return bin_search(v, left, mid - 1, target);
}
else
{
return bin_search(v, mid + 1, right, target);
}
}
非递归实现
int bin_search(vector<int> v, int target)
{
if (v.size() == 1)
return -1;
int left = 0, right = v.size() - 1, mid;
while (left <= right)
{
mid = left + (right - left) / 2;
if (v[mid] == target)
return mid;
else if (v[mid] > target)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
典型应用:
69.求平方根
//执行用时 8 ms, 在所有 C++ 提交中击败了50.02%的用户
class Solution {
public:
int mySqrt(int x) {
int left = 0,right = x;
if(x==1) return 1;
while(left < right){
int mid = left+(right - left)/2;
if(mid > x/mid){
right = mid;
}else if(mid*mid < x){
if((mid+1) > x/(mid+1)) return mid;
else left = mid;
}else{
return mid;
}
}
return 0;
}
};