剑指Offer--查找数组

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

两种方法:
第一种比较普遍的遍历所有,那我们首先就需要确定从数组的哪个地方开始查找.比较好的位置就是从四个角开始搜索.
个人选了从右上角开始,没啥原因,就是想而已,其他地方也可以,只不过是代码的数字改变而已.

public static boolean find1(int[][] array ,int target){
    //判断特殊情况
    if (array == null || array.length == 0){
        return false;
    }
    int row = 0 ;
    int column = array[0].length - 1 ;

    while (row < array.length && column >= 0){
        if (array[row][column] == target){
            return true ;
        }
        //比查找的数大,往前查找
        if (array[row][column] > target){
            column-- ;
        } else {
            //数组为递增,右上角是第一行最大的数
            //如果比查找的数小,则需要到下一行寻找
            row++;
        }
    }
    return false ;
}

第二种方法则是二分法:
[1]二分法查找适用于数据量较大时,但是数据需要先排好顺序(题目中说为递增函数,满足)
[2]确定该区间的中间位置K
[3]将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域
[4]继续二分

private static Boolean find2(int[][] array, int target) {
    //判断特殊情况
    if (array == null || array.length == 0) {
        return false;
    }
    //确定数组中间数
    int left = 0;
    int right = array.length * array[0].length - 1;
    int col = array[0].length;
    while (left <= right) {
        int mid = (left + right) / 2;
        //确定数组中间值
        int value = array[mid / col][mid % col];
        if (value == target) {
            return true;
        } else if (value < target) {
            //此时中间值小于查找数,往下一块区域查询
            left = mid + 1;
        } else {
            //往左边区域查找
            right = mid - 1;
        }
    }
    return false;
}

关于数组中间值确定的方法有很多种,我也是查询了一些大佬们的方法,选了一种能记得下来的方式,至于原理还要再理解一下.不过这个相当于公式,先套用了再说.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值