剑指offer 04.二维数组的查找

题目链接

暴力

暴力写法直接循环遍历二位数组,查找该值是否存在
时间复杂度为:O(nm)

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

        return false;
    }
}

线性查找

在题目中有个特性,每一行的从左到右都是递增的,每一列从上到下都是递增的。利用这个性质我们可以发现矩阵的左下角或右上角的数据在其右上或左下的两个方向的数据对比当前值是对立的(一个大于一个小于),所以可以利用这个特性,在查找的时候每一次比较可以将一部分的数据进行排除,缩小范围,最后直到找到数据或者不存在。
时间复杂度为:O(n + m)

我们选择从右上角开始查找。

  • 如果当前数组中没有数据,直接返回 \(false\)
  • 如果当前数据等于 \(target\) 直接返回 \(true\)
  • 如果 \(target\) 小于当前值,那么该列 \(j\) 正下方的数据都是不合理数据,所以 \(j - 1\)
  • 如果 \(target\) 大于当前值,那么改行 \(i\) 正左方的数据都是不合理数据,所以 \(i + 1\)

CPP

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.size() == 0) return false;
        int n = matrix.size(), m = matrix[0].size();
        int i = 0, j = m - 1;
        while(i < n && j >= 0){
            if(target == matrix[i][j]) return true;
            if(target > matrix[i][j]) i ++;
            else j --;
        }

        return false;
    }
};

Java

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix.length == 0) return false;
        int n = matrix.length, m = matrix[0].length;
        int i = 0, j = m - 1;

        while(i < n && j >= 0){
            if(target == matrix[i][j]) return true;
            if(target > matrix[i][j]) i ++;
            else j --;
        } 

        return false;
    }
}
posted @ 2022-03-21 20:32  Lngstart  阅读(28)  评论(0编辑  收藏  举报