剑指offer:二维数组中的查找

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

示例:在以下二维数组中查找数字 7 ,返回值为true;查找 3 返回值为 false。

分析:

方法一:首先将target与二维数组第一行比较,当target大于,某一数据时停止比较,记录当前位置,然后从当前位置倒着依次与target进行比较

 public static boolean search1(int[][] arr,int target){

        //若数组为空直接返回 false
        if(arr.length == 0 || arr[0].length == 0){
            return false;
        }

        //与二维数组第一行进行比较,确定count的值
        int count = -1;
        for(int i =0;i<arr.length;i++){
            if(arr[0][i] > target){
                break;
            }
            count++;
        }

        //倒着进行比较
        for(int i=count;i>=0;i--){
            for(int j=0;j< arr.length;j++){
                if(arr[j][i] == target){
                    return true;
                }
            }
        }
        return false;
    }

方法二:对二维数组的每一行进行二分查找

 public static boolean search2(int[][] array,int target){
        //若数组为空,直接返回false
        if(array.length == 0 || array[0].length == 0){
            return false;
        }

        for(int i=0;i< array.length;i++){
            int low = 0;
            int high = array.length-1;
            
            while (low <= high){
                int mid = (low + high)/2;
                int midVal = array[i][mid];
                if(target == midVal){
                    return true;
                }else if(midVal > target){
                    high = mid - 1;
                }else{
                    low = mid + 1;
                }
            }
        }
        return false;
    }

方法三:从二维数组的右上角开始查找。若大于target,则row++;若小于target,则col--。

 public static boolean search3(int[][] array,int target){
        //若数组为空,直接返回false
        if(array.length==0 || array[0].length==0){
            return false;
        }

        //获得左上角元素
        int row = 0;
        int col = array[0].length-1;

        while (row<=array.length-1 && col>=0){
            int value = array[row][col];
            if(value == target){
                return true;
            }else if(target > value){
                row++;
            }else{
                col--;
            }
        }

        return false;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值