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)