剑指 Offer 04. 二维数组中的查找

题目

在一个 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。

限制:

0 <= n <= 1000
0 <= m <= 1000

解答

暴力法

    /**
     *  1. 暴力法
     * @param matrix
     * @param target
     * @return
     */
    public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int n = matrix.length, m = matrix[0].length;

        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < m ; j++) {
                if(matrix[i][j] == target)
                    return true;
            }
        }
        return false;
    }

找规律

    /**
     * 找规律: 在所列举的例子中,如果 我们想判断二维数组是否存在元素13,可以通过如下过程:
     * 1. 将13 和右上角的15比较,15 > 13, 由于15是这一列最小的数,所以第5列的其他元素肯定没有13.剔除第5列
     * 2. 将13 和 剩下列的右上角的11比较, 13 > 11, 由于11是余下矩阵中这一行最大的元素,所以 11 这一行不可能有13,剔除第1行
     * 3. 将13 和 余下矩阵中的右上角元素12比较, 13 > 12, 12 是这一行最大元素,剔除第2行
     * 4. 将13 和 余下矩阵中的右上角元素 16比较, 16 > 11 , 11 这一列不可能有12, 剔除第4列
     * 5. 将13 和 余下矩阵中的右上角元素9比较, 11 > 9, 剔除第3行
     * 6. 将13 和 14 比较,14 > 13 ,剔除第3列
     * 7. 将13 和 13 比较 13 = 13  找到元素,返回true。
     * @param matrix
     * @param target
     * @return
     */
    public static boolean findNumberIn2DArray2(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int n = matrix.length, m = matrix[0].length;

        int row = 0, col = m - 1;
        while(row < n && col >= 0){
            if(matrix[row][col] == target)
                return true;
            else if(matrix[row][col] > target)
                --col;
            else
                ++ row;
        }
        return false;
    }
posted @ 2021-07-01 17:23  sinlearn  阅读(37)  评论(0编辑  收藏  举报