【剑指Offer】04.二维数组中的查找(java)

【分析】

现在一看到题,第一反应,暴力求解。虽然不用费脑子,但是时间复杂度高啊。

这道在二维数组中查找目标值的题,也可以暴力查找,复杂度O(mn)。但是,这样题目给定的"每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序"就毫无用处了。

所以,还是要动动小脑袋。

根据题目给定的条件,数组中的值沿主对角线方增大,如图所示:

图1

对于(i,j)位置的元素来讲,左上都比它小,右下都比它大。这就提供了一个思路,从右上角开始查找目标值,根据目标值的大小向左向下移动。如果目标值大,往下找;如果目标值小,往左找。

【示例】

给定目标值5:

图2

给定目标值20:

图3

【代码】

class Solution {
    public 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;
        int row = 0, col = m-1;

        while(row<n && col>=0){
            int num = matrix[row][col];
            if(num == target){
                return true;
            } else if(num > target){
                col--;
            } else{
                row++;
            }
        }
        return false;
    }
}
发布了88 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Q_smell/article/details/105684339