剑指 Offer 04. 二维数组中的查找——线性查找

一、题目

二、方法(暴力+ 线性查找)

暴力搜索 -- O(n * m)

最简单的肯定就是暴力搜索,由于n 和 m 都是1000, 所以n *m 最大为 1000000 < 1e8

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        // 1.n * m
        int n = matrix.length;
        if(n == 0) return false;
        int m = matrix[0].length;
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                if(target == matrix[i][j])return true;
            }
        }
        return false;
    }
}

 线性查找 - O(n + m)

很显然,题目给出的递增条件还没用,所以肯定还有更好的方法减少时间复杂度 .

一开始看见递增,很自然会想到用二分尝试一下试试,left = 0 , right = n * m  - 1,能过一些用例。思考后发现,把二维的数组转化为一维数组,使用二分的前提是要满足这个一维数组单具有二分性,很显然没有。--失败

然后接着想使用两次二分看看能不能解决,比如先使用行二分,确定行的位置;再使用列二分,确定列的位置,发现这样也是不行的。随便找两个例子就能说明了 ---失败

然后就去翻答案了....

线性查找---优秀

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        // 1.n * m
        // int n = matrix.length;
        // if(n == 0) return false;
        // int m = matrix[0].length;
        // for(int i = 0 ; i < n ; i++){
        //     for(int j = 0 ; j < m ; j++){
        //         if(target == matrix[i][j])return true;
        //     }
        // }
        // return false;

        //2.线性查找n + m---不是二分!!!!
        int n = matrix.length;
        if(n == 0) return false;
        int m = matrix[0].length;
        if(m == 0) return false;
        int i = 0, j =  m  - 1;
        while(i < n && j >= 0){  // i 最多执行 n 次 , j 最多执行 m次 ,所以时间复杂度O(n + m);
           if(matrix[i][j] == target)return true;
           else if(matrix[i][j] < target)i++;
           else j--;
        }
        return false;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值