二分查找也称折半查找(Binary Search),是一种效率较高的查找方法,前提是数据结构必须先排好序,且要求为线性表,具有有随机访问的特点(如数组)。查找的时间复杂度为 O(logN)。
二分查找模板:
int bsearch(int[] arry, int num, int val)
{
int left = 0;
int high = num-1;
while (left <= right)
{
int mid = left + ((right- left) >> 1);
if (arry[mid] == val)
{
return mid;
}
else if (arry[mid] < val)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
递归二分查找模板:
int bsearch(int[] arry, int num, int val)
{
return bsearchInternally(arry, 0, num-1, val);
}
int bsearchInternally(int[] arry, int left, int right, int val)
{
if (left > right)
return -1;
int mid = left + ((right- left) >> 1);
if (arry[mid] == val)
{
return mid;
}
else if (arry[mid] < val)
{
return bsearchInternally(arry, mid+1, right, val);
}
else
{
return bsearchInternally(arry, left, mid-1, val);
}
}
LeetCode:
(69)X的平方根
int mySqrt(int x) {
if(x == 1)
return 1;
int left = 0;
int right = x;
while(right - left > 1)
{
int mid = left + (right - left)/2;
if(x / mid < mid)
right = mid;
else
left = mid;
}
return left;
}
时间复杂度:O(logN)
空间复杂度:O(1)