问题描述:
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 in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.
For example,
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
分析:我的思路就是简单地对矩阵进行过滤压缩,首先,通过查找第一行和第一列,确定行与列的范围。然后对于每行进行二分查找。当然先根据有效的最后一列判断是否在对应范围内,如果不在,continue
代码如下:272ms
bool binarySearch(int *row,int start,int end,int target){//左开右闭
int mid;
while(start<end){
mid = (start+end)/2;
if(row[mid]==target)
return true;
else if(row[mid]>target){
end = mid;
}else{
start = mid+1;
}
}
return false;
}
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int row,col;
for(col = 0;col<matrixColSize;col++){
if(matrix[0][col]>target)
break;
else if(matrix[0][col]==target)
return true;
}//get valid cols
for(row = 0;row<matrixRowSize;row++){
if(matrix[row][0]>target)
break;
else if(matrix[row][0]==target)
return true;
}//get valid rows
int i,j;
for(i = 1;i<row;i++){
if(matrix[i][col-1]<target)
continue;
else if(matrix[i][col-1]==target)
return true;
//binary search
if(binarySearch(matrix[i],1,col,target))
return true;
}
return false;
}
后来在网上看到一篇博客这里写链接内容,非常好的思路,它的核心思想是:从右上角开始,矩阵的元素大于target,那么这一列不可能有,如果矩阵元素小于target,那么这一行不可能有。这样一来,时间复杂度就降为了O(m+n),空间复杂度为O(1)
代码如下:176ms
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int row = 0;
int col = matrixColSize-1;
while(row<matrixRowSize&&col>=0){
if(matrix[row][col]==target)
return true;
else if(matrix[row][col]>target)
col--;
else
row++;
}
return false;
}