LeetCode剑指Offer04.二维数组中的查找

LeetCode剑指Offer04.二维数组中的查找

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

示例:

现有矩阵 matrix 如下:

[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。

给定 target = 20,返回 false。

限制:

0 <= n <= 1000

0 <= m <= 1000

题解
1.无脑双重循环版(纯为ac,面试时不可这样答)

class Solution {
    
    
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
    
    
       if (matrix.size()==1&&matrix[0].size()==0) return false;//防止[[]]的出现
        for(int i=0;i<matrix.size();i++){
    
    
            if(matrix[i][0]>target) break;//如果该行的第一个比target还大说明后面已经不会有相等的了
            for(int j=0;j<matrix[0].size();j++){
    
    
                if(matrix[i][j]==target) return true;
            }
        }
        return false;
    }
};

时间复杂度 O(n*m),空间复杂度O(1)
2.线性查找
注意看题目:每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
也就是说:每个元素的左边都比该元素小,下边都比该元素大。
也可以说我们可以从最右上角开始比较,如果target比该数大,就向下一个数继续与target比较,如果target比该数小,就向左一个数继续与target比较。

class Solution {
    
    
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
    
    
            if((matrix.size()==1&&matrix[0].size()==0)||matrix.size()==0) return false;
            int row=0,col=matrix[0].size()-1;//从第一行最后一个开始 row:行/col:列
            while(row<matrix.size()&&col>=0){
    
    
                if(target>matrix[row][col]){
    
    
                   row++;
                }else if(target<matrix[row][col]){
    
    
                    
                    col--;
                }else{
    
    
                    return true;
                }
            }
            return false;
    }
};   

最坏情况是target为最左下角,时间复杂度度即为O(n+m)。
时间复杂度 O(n+m),空间复杂度O(1)

猜你喜欢

转载自blog.csdn.net/qq_45035709/article/details/108504209