【面试题2 :二维数组中的查找】

题目

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

比如这样的二维数组:

{
    {1, 2, 8, 9},  
    {2, 4, 9, 12},  
    {4, 7, 10, 13},  
    {6, 8, 11, 15}  
}

然后判断是否存在某一个数。

思路

考察数组的特性,我们如果从右上角的元素开始找,比如我们要找4,比9小,那么直接删除列即可,因为这个列上的元素看到都大于9;那么我们这时锁定8,发现还是比他小,再删除一列;这时变成了2,发现4比他大,则删除行;这个是后就锁定了4,就是我们想要的答案。

规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;

如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。

也就是说如果要查找的数字不在数组的右上角,则每-次都在数组的查找范围中剔除)行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

程序

public class Test02 {
    /**
     * @Author 【swg】.
     * @Date 2018/3/7 19:50
     * @param arr 待查找的数组
     * @param number 要查找的数
     * @return 查找结果,true找到,false没有找到
     */
    public static boolean find(int[][] arr,int number){
        if(arr == null || arr.length < 1 || arr[0].length < 1){
            return false;
        }
        //统计行数和列数
        int rows = arr.length;
        int cols = arr[0].length;

        //初始位置为第一行最后一列
        int row = 0,col = cols-1;

        while(row >=0 && col >=0 && row < rows && col <cols){
            if(arr[row][col] == number){
                return true;//相等则直接返回
            }else if(arr[row][col] > number){
                col--;//数组中的这个数比number大,则删除这个列
            }else {
                row++;//数组中的这个数比number小,则删除这个行
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 8, 9},
                {2, 4, 9, 12},
                {4, 7, 10, 13},
                {6, 8, 11, 15}
        };
        System.out.println(find(matrix, 7));    // 要查找的数在数组中
        System.out.println(find(matrix, 5));    // 要查找的数不在数组中
        System.out.println(find(matrix, 1));    // 要查找的数是数组中最小的数字
        System.out.println(find(matrix, 15));   // 要查找的数是数组中最大的数字
        System.out.println(find(matrix, 0));    // 要查找的数比数组中最小的数字还小
        System.out.println(find(matrix, 16));   // 要查找的数比数组中最大的数字还大
        System.out.println(find(null, 16));     // 健壮性测试,输入空指针
    }
}

运行结果:

true
false
true
true
false
false
false

猜你喜欢

转载自blog.csdn.net/sunweiguo1/article/details/80329068