在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int i = matrix.length - 1;
int j = 0;
while (j < matrix[0].length && i >= 0) {
System.out.println(matrix[i][j]);
if (matrix[i][j] == target) {
return true;
}
if (matrix[i][j] > target) {
System.out.println("i--");
i--;
}
if (i >= 0 && matrix[i][j] < target) {
System.out.println("j++");
j++;
}
//System.out.println("i:" + i + " j:" + j + " num:" + matrix[i][j]);
}
return false;
}
思路
因为
array[n][m]
数组的行和列都是从小到大排列
所以 我们从array[n-1][0]
或者array[0][m-1]
开始查找
我们以从array[n-1][0]
开始举例
- 判断当前位置元素是否与target相等
- 相等 返回true 不相等判断当前元素和target大小
- 若当前元素大于target 则
i--
(当前元素为当前行最小元素 所以该行所以元素都大于target)
若当前元素小于target 则j++
(当前元素为当前列最大元素 所以该列所以元素都小于target)- 返回第一步
出现的问题
if (i >= 0 && matrix[i][j] < target) {
System.out.println("j++");
j++;
}
- 没有加i>=0 由于之前的
i--
导致i
数组越界 - 把i>=0 写成了 i>0
疑惑
将代码的直接
if
判断 改成if...else if...else
时 执行时间边长了 有没有dio
大的懂哥说一说
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int i = matrix.length - 1;
int j = 0;
while (j < matrix[0].length && i >= 0) {
System.out.println(matrix[i][j]);
if (matrix[i][j] == target) {
return true;
}else if (matrix[i][j] > target) {
i--;
if (i<0){
return false;
}
}else {
j++;
}
}
return false;
}