剑指 Offer 04. 二维数组中的查找(JAVA版)

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


剑指 Offer 04. 二维数组中的查找(JAVA版)_第1张图片

可见,对于这样的一个数组,如果我们仅仅用暴力遍历的方法,虽然可以解决这个需求,但是时间复杂度过高,达到了O(n²)。因此,我们可以这样想:我们找右上角作为标志点,如果我们要查找的目标数大于这个标志点,那么我们最上边一行的数均可以不考虑,就向下移一行;如果我们要查找的目标数小于这个标志点,那么我们最右边一列的数均可以不考虑,就向左移动一列。然后标志点继续用我们考虑范围内的二维矩阵的最右上角,重复上述过程,如果找到返回true,数组要越界的时候返回false。


下面我们来看代码:

    public boolean FindNumberIn2DArray(int[][] matrix, int target) {
        if(matrix.length==0)return false;//如果数组为空,直接返回false即可
        //右上角的数从第1行和最后一列开始
        int row=0; 
        int column=matrix[0].length-1;
        //当数组不越界的时候继续遍历
        while(column>=0&&row< matrix.length){
            if(matrix[row][column]target)column-=1;//标志数大于目标数,同列不用考虑,直接左移一列
            else return true; //找到了,返回true
        }
        return false; //没找到,返回false
    }

你可能感兴趣的:(java算法,数据结构,java,算法)