思路:縮小問題規模 (減治)
設矩陣左下角元素 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是列數)