【二分搜索算法】搜索二维矩阵/C++/Leedcode/源码

二分搜索算法

举个简单的例子:
给出一个1-100的数,要求在一个1-100的升序数列中找出它。

第一想法:蛮力法。如果使用蛮力法则遍历1-100,遍历100个数,很麻烦。

那么,如果首先问这个数和中间数50的关系,三种情况:
情况1:大于50,则在51-100中搜索,剩余的一半数无用丢掉。
情况2:小于50,则在1-50中搜索,剩余的一半数无用丢掉。
情况3:等于50,找到了,返回结果。
这样可以直接删除无用的一半,节省一半的任务量。

依此类推,不断询问目标数与中间数的关系,删除无用的一半,直到找到目标数为止,这样不断二分,删除无用一半的方法就叫二分搜索算法。

Leedcode例题

  1. 搜索二维矩阵
    编写一个高效的算法来判断 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值