题目
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.
思路:直接遍历搜索法
直接遍历搜索,实现代码比较简单
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
return false;
}
if(target<matrix[0][0]||target>matrix[matrixRowSize-1][matrixColSize-1]){
return false;
}
for(int i=0;i<matrixRowSize;i++){
for(int j=0;j<matrixColSize;j++){
if(matrix[i][j]==target){
return true;
}
}
}
return false;
}
AC结果如下:Runtime 4ms
思路二
思路一采用的是直接遍历的方法来寻找,没有利用到本题中矩阵本身由的一些性质,性质如下:
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.//下一行的第一个数大于上一行的最后一个数
利用这两点的思路为:
先找到target所在的那一行,然后去找到那一列,都是用二分查找法来寻找。
实现代码如下:
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
return false;
}
if(target<matrix[0][0]||target>matrix[matrixRowSize-1][matrixColSize-1]){
return false;
}
int beginRow=0;
int beginCol=0;
int endRow=matrixRowSize-1;
int endCol=matrixColSize-1;
while(beginRow<endRow){
int midRow=beginRow+(endRow-beginRow)/2;
int midCol=beginCol+(endCol-beginCol)/2;
if(matrix[midRow][midCol]==target){
return true;
}
else if(matrix[midRow][midCol]>target){
if(matrix[midRow][0]>target){
endRow=midRow-1;
}
else{
beginRow=midRow;
endRow=midRow;
}
}
else{//matrix[midRow][midCol]<target
if(matrix[midRow][endCol]<target){
beginRow=midRow+1;
}
else{
beginRow=midRow;
endRow=midRow;
}
}
}
while(beginCol<=endCol){
int midCol=beginCol+(endCol-beginCol)/2;
if(matrix[beginRow][midCol]==target){
return true;
}
else if(matrix[beginRow][midCol]>target){
endCol=midCol-1;
}
else {
beginCol=midCol+1;
}
}
return false;
}
虽然利用了上面的性质,从理论上面来看,时间复杂度为O(log(m*n)),但是,从AC结果来看,Runtime 仍然是4ms,没有什么变化,。