题目链接:https://leetcode-cn.com/problems/search-a-2d-matrix/description/
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 输出: true
示例 2:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 输出: false
在已排好序的数组中找一个数,找到则返回true,否则返回false,这是一道明显的二分查找的题目!初始左边界left=0,右边界为数组的总个数right=matrixRowSize*matrixColSize,mid定位二维数组中的某个值可以使用除法以及求余得到行列数,即行i=mid/matrixColSize,列=mid%matrixColSize。只要厘清这些,二分查找二维数组便也不难了!
此外,有几个特殊情况需要注意一下:
- 空数组直接返回false;
- 数组中只有1个数,直接比较后返回true/false。
代码如下:
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
if(!matrixRowSize){//特殊情况1
return false;
}
if(matrix[0][0]==target){//特殊情况2
return true;
}
int left=0,right=matrixRowSize*matrixColSize,mid;
while(left+1<right){
mid=(left+right)/2;
int temp=matrix[mid/matrixColSize][mid%matrixColSize];
if(temp<target){
left=mid;
}
else if(temp>target){
right=mid;
}
else{
return true;
}
}
return false;
}