题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

首先将这个二维数组看做是一个矩阵,考虑这么一个思路,首先在矩阵中选取一个数,如果要查找的数大于这个数,那么该数应该在选取数字的下方或者右方,如果该数小于选取的数,那么这个数应该在选取数字的上方或者左方,无论怎样,查找的数都会在选取位置的两个区域都出现,并且这两个区域有重叠的部分,这使得问题较为复杂,

现在不妨换一种思路,我们从右上角开始进行查找,如果查找的数比右上角的数小,那么该数只可能在左方,如果查找的数比右上角大,那么该数只可能在下方,查找的数都只会在一个区域出现,要么在左方,要么在下方,每一次查找都会使得查找的区域变小,下面以查找数字5为例

代码如下

public class Test {

public static boolean findInMatrix(int[][] matrix, int number) {
boolean found = false;

// 获得矩阵的行数和列数
int rows = matrix.length;
int columns = matrix[0].length;

if (matrix != null && rows > 0 && columns > 0) {
// 从右上角开始查找
int row = 0;
int column = columns - 1;
// 继续查找的条件
while (row < rows && columns >= 0) {
if (matrix[row][column] == number) {
// 找到退出while循环
found = true;
break;
} else if (matrix[row][column] > number) {
// 比右上角小 在左方
column--;
} else {
// 否则比右上角大 在下方
row++;
}
}
}

return found;
}

public static void main(String[] args) {
int[][] matrix = {{1, 2, 3}, {2, 4, 6}, {3, 6, 9}};

boolean found = findInMatrix(matrix, 2);
System.out.println(found);
}
}