在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 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]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
思路:二维数组中,从左到右,从上到下是递增的,所以可以从将目标数从右上角开始遍历,如果当前数小于目标数,就向下遍历,如果当前数大于目标数就向左遍历。直到遍历完整个二维数组。
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null||matrix.length==0||matrix[0].length==0){
return false;
}//如果二维数组为空,或者行数为0,或者列数为0,那么直接返回false
int rows=matrix.length;//
int cols=matrix[0].length;
int r=0;//设置起始点,从右上角的第一个数开始遍历。
int c=cols-1;//列下标比列数少1
while(r<=rows-1 &&c>=0){//只要行下标不超过二维数组的行数,列下标不小于列数。
if(matrix[r][c] == target){//如果找到目标值就返回true
return true;
}
else if(matrix[r][c] < target){如果遍历到的数值比目标值小,就往下一行遍历
r++;
}
else{//如果遍历的数值比目标值大,就往同一行中左边的列遍历。
c--;
}
}
return false;//遍历完整个二维数组之后没有找到目标值,说明目标值不在这个二维数字中,返回false。
}