二分搜索算法
举个简单的例子:
给出一个1-100的数,要求在一个1-100的升序数列中找出它。
第一想法:蛮力法。如果使用蛮力法则遍历1-100,遍历100个数,很麻烦。
那么,如果首先问这个数和中间数50的关系,三种情况:
情况1:大于50,则在51-100中搜索,剩余的一半数无用丢掉。
情况2:小于50,则在1-50中搜索,剩余的一半数无用丢掉。
情况3:等于50,找到了,返回结果。
这样可以直接删除无用的一半,节省一半的任务量。
依此类推,不断询问目标数与中间数的关系,删除无用的一半,直到找到目标数为止,这样不断二分,删除无用一半的方法就叫二分搜索算法。
Leedcode例题
- 搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int low = 0; //二分搜索的左边界,初始化为全部内容的左边界
int high = matrix.size() * matrix[0].size() - 1; //右边界
while (low <= high) { //循环直到左右边界重合即为结果
int mid = (high - low) / 2 + low; //计算左右边界的中心
int x = matrix[mid / n][mid % n]; //访问中间
//将目标数与中心进行比较,依据结果并改变左右边界
if (x < target) low = mid + 1;
else if (x > target) high = mid - 1;
else return true;
}
/*第二种方法 这种方法最后汇聚在一个点上,方便不在循环中return的二分查找情况
while (low < high) { //循环直到左右边界重合即为结果
int mid = (high - low) / 2 + low; //计算左右边界的中心
int x = matrix[mid / n][mid % n]; //访问中间
//将目标数与中心进行比较,依据结果并改变左右边界
if (x < target) low = mid + 1;
else if (x > target) high = mid;
else return true;
}
*/
return false;
}