文章目录
题目
二分查找:74. 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
代码
cpp
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//判断矩阵是否为空
if(matrix.empty()||matrix[0].empty()){
return false;
}
//数组的行和列
int m=matrix.size();
int n=matrix[0].size();
//二份查找的两个位置
int left=0;
int right=m*n-1;
while(left<=right){
int mid=left+(right-left)/2;
//在数组中的映射关系
int row=mid/n;
int col=mid%n;
//如果与目标值相等直接返回true
if(matrix[row][col]==target){
return true;
}else if(matrix[row][col]<target){//如果目标值在中间值的右边,则左边界为mid+1
left=mid+1;
}else{//如果目标值在中间值的左边,则右边界为mid-1
right=mid-1;
}
}
return false;
}
};
原理图

原理解释
提示:算法流程及解释在代码中已标注
在不使用额外矩阵的情况下,在原有的矩阵上进行二分查找
涉及到元素在二维数组中和元素在一维数组中的映射关系
以一维数组为例:
i为一维数组下标,n为二维数组的列
row=i/n;
col=i%n;
时间复杂度:O (log (m*n)) 二分查找
空间复杂度:O (1) 仅用常数变量