二维数组中的查找

题目描述

来自《剑指offer》的原题,但是实现了两种方法并对时间效率进行了测试。
在这里插入图片描述

解题思路

第一种 – 二维矩阵中的二分法

这种方法思路跟剑指offer原文中的思路相似
step1: 规定矩阵size ⇒ (m, n)
step2: 建立坐标点上下限 ⇒ x = (0,m-1), y = (0,n-1)
step3: 通过二分法逐步确定我们所选取点的坐标,比如第一步为((0 + m-1)/2, (0 + n-1)/2)
step4: 通过对比target数值,确定下一步的搜索范围
如果data[i][j] = target,则返回true
如果data[i][j] > target,则除去{ x1>i, y1>j| (x1,y1)}的点都要搜索 ⇒ 返回step3
如果data[i][j] < target,则除去{ x1<i, y1<j| (x1,y1)}的点都要搜索 ⇒ 返回step3

代码

public static boolean Find(int target, int [][] array) {
        return Find(target, array, 0, array.length-1, 0, array[0].length-1);
    }
    public static boolean Find(int target, int[][] array, int xs, int xe, int ys, int ye){
        if(xs>xe || ys>ye) return false;

        int xm = (xs+xe)/2;
        int ym = (ys+ye)/2;
        if(array[xm][ym]==target){
            System.out.println(xm + " " + ym);
            return true;
        }else if(array[xm][ym]>target){
            return Find(target, array, xs, xm-1, ym, ye)||
                    Find(target, array, xs,   xe, ys, ym-1);
        }else{
            return Find(target, array, xm+1, xe, ys, ym) ||
                    Find(target, array, xs,   xe, ym+1, ye);
        }
    }

时间效率

在牛客网的剑指offer刷题中测试时间为:173ms

第二种 – 剑指offer中的思路

思路

摘自剑指offer
在这里插入图片描述
在这里插入图片描述

代码

    public static boolean findByMethod2(int[][] data, int target){
        if (data==null || data.length==0 || data[0] == null || data[0].length == 0){
            return false;
        }
        int m=data.length, n=data.length;
        int i=0, j=n-1;
        while (j>=0 && i<m){//----!!
            if (data[i][j] == target){
                System.out.println(i + " " + j);
                return true;
            }else if (data[i][j] > target){
                j-=1;
            }else {
               i+=1;
            }
        }

        return false;
    }

时间效率

在牛客网的剑指offer刷题中测试时间为:150ms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值