刷题打卡 | 剑指Offer之查找特殊二维数组中的数

77 阅读2分钟

剑指Offer👉问题01:查找特殊二维数组中的数

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

问题描述:

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

解题思路:

  思路一:最简单最容易想到的办法就是暴力求解。如果真的笔试或者其他情况下碰到类似的问题,并且自己一时没有其他更好的思路的时候,求解问题答案就变成了第一目标,暴力求解也不是不可以用的。

  思路二:推荐解法。由于二维数组存在上到下递增,左到右递增的特殊性。应该从矩阵的右上角或者左下角开始查找。 以右上角为例,首先选取右上角的数字,如果该数字等于要查找的数字,则查找过程结束; 如果该数字大于要查找的数字,则说明该列其他元素都大于要查找的数字,便可以删掉该列; 如果该数字小于要查找的数字,则说明该行其他元素也都小于要查找的数字,便可以删掉该行。这样,每一次比较都可以剔除一行或者一列,进而缩小查找范围,时间复杂度为 O(n)。

示例:

查找特殊二维数组中的数字7:

02.png

求解:

方法一:暴力求解

public static boolean findNumber(int[][] tempArray, int target) {
        for (int i = 0; i < tempArray.length; i++) {
            for (int j = 0; j < tempArray[i].length; j++) {
                if (tempArray[i][j] == target){
                    System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
                    return true;
                }
            }

        }
        return false;
    }

方法二:推荐

public static boolean findNumberIn2DArray(int[][] tempArray, int target){

        // 若数组为空,直接返回 false
        if(tempArray == null || tempArray.length ==0){
            return false;
        }

        // 数组不为空时,从二维数组的右上角开始查询(或者左下角)
        for (int i = 0, j = tempArray[0].length-1; i < tempArray.length && j >= 0;){
            if(tempArray[i][j] > target){ //当前位置值比目标值大时,左移
                j--;
            }else if (tempArray[i][j] < target){ //当前位置值比目标值小时,下移
                i++;
            }else {
                System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
                return true;
            }
        }

        return false;
    }

完整代码

public static boolean findNumberIn2DArray(int[][] tempArray, int target){

        // 若数组为空,直接返回 false
        if(tempArray == null || tempArray.length ==0){
            return false;
        }

        // 数组不为空时,从二维数组的右上角开始查询(或者左下角)
        for (int i = 0, j = tempArray[0].length-1; i < tempArray.length && j >= 0;){
            if(tempArray[i][j] > target){ //当前位置值比目标值大时,左移
                j--;
            }else if (tempArray[i][j] < target){ //当前位置值比目标值小时,下移
                i++;
            }else {
                System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
                return true;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        int[][] tempArray = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
        int target = 7;

        boolean result = findNumberIn2DArray(tempArray, target);
        if (result){
            System.out.println("找到了");
        }else {
            System.out.println("未查询到目标值");
        }

    }

结果展

  代码设置的目标值为7,输出结果如图所示:

01.png