Java实现【较低复杂度】【二分查找二维数组】

public class 二分法查找矩阵数据 {

    public static void main(String[] args) {
        int [][] arr={
                      {11,14,24,34},
                      {41,45,56,61},
                      {64,84,90,101}
        };
        System.out.println(select(arr,61));
    }

//    这种二叉查找更加简单,空间复杂度更低
    static public boolean select(int [][] arr, int target){
//        1.当二维数组容量为0时,false
        if (arr.length==0 || arr[0].length==0) {
            return false;
        }
//        2.初始数据:start:第一个数据 end:最后一个数据 mid:中间值
//        3.在start小于end的条件之下循环,条件是arr[mid/len_2][mid%len_2] : target
//        4.公式获取==模运算
        /*
         当我们获取的7个数据时,行应该是7除这一行的长度,列为余数
         */
        int len_1= arr.length;
        int len_2= arr[0].length;
        int start =0,end=len_2*len_1-1,mid;
        while(start<=end){
            mid=(start+end)/2;
            if (arr[mid/len_2][mid%len_2] < target) {
                start=mid+1;
            }if (arr[mid/len_2][mid%len_2] > target) {
               end=mid;
            }if(arr[mid/len_2][mid%len_2] == target){
//                System.out.println(mid/len_2+","+mid%len_2);
                return true;
            }
        }
        return false;
    }

}

这样的二分查找应该是复杂度比较低的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值