思路:缩小问题规模 (减治)
设矩阵左下角元素 matrix[i][j],它是第 i 行最小值,同时也是第 j 列最大值
若 target < matrix[i][j] (小于第 i 行最小值),则排除第 i 行,令 i--
若 target > matrix[i][j] (大于第 j 列最大值),则排除第 j 列,令 j++
循环 2~3 直到找到 target,或所有行列均被排除
当然也可以从右上角开始
bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
int i = matrixRowSize - 1, j = 0;
while (i >= 0 && j < matrixColSize) {
if (target < matrix[i][j]) i--;
else if (target > matrix[i][j]) j++;
else return true;
}
}
return false;
}
二分:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(!matrix.size())return false;
int a=matrix.size();
for(int j=0;j<a;j++)
{
int r=matrix[0].size()-1, l=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(target<matrix[j][mid])
r=mid-1;
else if (target>matrix[j][mid])
l=mid+1;
else
return true;
}
}
return false;
}
};
时间复杂度是O(m*logn)(m是行数,n是列数)