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

    首先将这个二维数组看做是一个矩阵,考虑这么一个思路,首先在矩阵中选取一个数,如果要查找的数大于这个数,那么该数应该在选取数字的下方或者右方,如果该数小于选取的数,那么这个数应该在选取数字的上方或者左方,无论怎样,查找的数都会在选取位置的两个区域都出现,并且这两个区域有重叠的部分,这使得问题较为复杂,
    二维数组中的查找 - 图1
    现在不妨换一种思路,我们从右上角开始进行查找,如果查找的数比右上角的数小,那么该数只可能在左方,如果查找的数比右上角大,那么该数只可能在下方,查找的数都只会在一个区域出现,要么在左方,要么在下方,每一次查找都会使得查找的区域变小,下面以查找数字5为例
    二维数组中的查找 - 图2
    代码如下

    1. public class Test {
    2. public static boolean findInMatrix(int[][] matrix, int number) {
    3. boolean found = false;
    4. // 获得矩阵的行数和列数
    5. int rows = matrix.length;
    6. int columns = matrix[0].length;
    7. if (matrix != null && rows > 0 && columns > 0) {
    8. // 从右上角开始查找
    9. int row = 0;
    10. int column = columns - 1;
    11. // 继续查找的条件
    12. while (row < rows && columns >= 0) {
    13. if (matrix[row][column] == number) {
    14. // 找到退出while循环
    15. found = true;
    16. break;
    17. } else if (matrix[row][column] > number) {
    18. // 比右上角小 在左方
    19. column--;
    20. } else {
    21. // 否则比右上角大 在下方
    22. row++;
    23. }
    24. }
    25. }
    26. return found;
    27. }
    28. public static void main(String[] args) {
    29. int[][] matrix = {{1, 2, 3}, {2, 4, 6}, {3, 6, 9}};
    30. boolean found = findInMatrix(matrix, 2);
    31. System.out.println(found);
    32. }
    33. }