二维数组的查找(牛客网)

一、题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、我的思路:
二维数组的查找(牛客网)_第1张图片
设计思路:
从第一行到最后一行起,每一行都是:
先用二分查找找到本行比target小的数字,然后这个数字右边的所有列都比target大,故去除;
即程序中的i1 = binarySearch(target,array[i2],0,i1);(i1即是下一行查找的列的范围最右边)
这一行target左边的数字都比target小,也去除。
即程序中的i2=i2+1;(即下一列)
三、代码

/**
 * @ClassName Search01
 * Description TODO
 * @Auther 青青子衿
 * @Date 2019/8/8 10:24
 */
public class Search01 {

    public static int binarySearch(int target,int[] array, int start, int end){
        if(target>array[end]){
            return end;
        }
        int middle=0;
        while(start<=end){
            middle = (start+end)/2;
            if(array[middle]==target){
                return middle;
            }else if(array[middle]<target){
                start = middle+1;
            }else{
                end = middle-1;
            }
        }
        if(start>middle){
            return middle;
        }
        if(end<middle){
            return middle-1;
        }
        return -100;
    }

    public static boolean Find(int target, int [][] array) {
        int n1 = array[0].length;
        int n2 = array.length;
        //判断是否在二维数组范围内
        if (n1==0||n2==0) {
            return false;
        }
        if(target<array[0][0]||target>array[n2-1][n1-1]){
            return false;
        }
        int i1=n1-1, i2 = 0;
        while(i1>=0&&i2<=n2-1){
            i1 = binarySearch(target,array[i2],0,i1);
            if(i1>=0&&i2<=n2-1&&target==array[i2][i1]){
                return true;
            }
            i2=i2+1;
        }
        return false;
    }

    public static void main(String[] args){
        int[][] array ={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
//        int[][] array ={{}};
        System.out.println(Find(5,array));
    }
} 

去看了看别人的思路,发现人家的思路比我的明了许多。
https://blog.csdn.net/alidada_blog/article/details/82494856

你可能感兴趣的:(算法)