Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3
, return true
.
这个经过分析后会发现其实就是考察在有序数组中查找给定元素的题,使用二分查找进行了,需要注意到数组索引和2D矩阵索引的转换就行了,代码如下(递归和循环):
class Solution {
public:
/*
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(!matrix.size()) return false;
int row=matrix.size();
int col=matrix[0].size();
int num=row*col;
return searchMatrix(matrix,target,0,num-1,row,col);
}
bool searchMatrix(vector<vector<int>>& matrix, int target,int low,int high,int row,int col){
if(matrix[low/col][low%col]>target) return false;
if(matrix[high/col][high%col]<target) return false;
//if(matrix[low/col][low%row]==target||matrix[high/col][high%row]==target) return true;
if(low==high) return matrix[low/col][low%col]==target;
int mid=(low+high)/2;
if(matrix[mid/col][mid%col]>=target)
return searchMatrix(matrix,target,low,mid,row,col);
else if(matrix[mid/col][mid%col]<target)
return searchMatrix(matrix,target,mid+1,high,row,col);
}*/
bool searchMatrix(vector<vector<int>>& matrix, int target){
if(!matrix.size()) return false;
int row=matrix.size();
int col=matrix[0].size();
int num=row*col;
int low=0,high=num-1;
while(low<high){
if(matrix[low/col][low%col]>target) return false;
if(matrix[high/col][high%col]<target) return false;
int mid=(low+high)/2;
if(matrix[mid/col][mid%col]>=target){
high=mid;
}else if(matrix[mid/col][mid%col]<target){
low=mid+1;
}
}
return matrix[low/col][low%col]==target;
}
};