首先一个坑,n和m的最小值是0,要特别判定。
题目保证了往右和往下一定变大,右上和左下不保证,那么可以得出一种结论,如果当前一个数大于target,它的右下块一定无效,同理,小于,则左上块无效。
解题时,可以取左上角点或右下角点,每次比较时去除无效的一行或一列,那么最多n+m次对比即可
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if ( matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int length1 = matrix.length;
int length2 = matrix[0].length;
int curx = 0;
int cury = length2 - 1;
while (curx < length1 && cury >= 0) {
if (matrix[curx][cury] == target) {
return true;
} else if(matrix[curx][cury] < target) {
curx++;
} else {
cury--;
}
}
return false;
}
}