题目:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
现有矩阵 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
。
分析:就是给定了数组的存储规律,来查找数组中是否有target值,有则返回true,否则返回false
注意两个判断条件,matrix[j][i]与target值比较 ,同时注意i j 的边界值判断。
给定二维数组求行列:
row=matrix.size();//行数
collor=matrix[0].size();//列数
代码:
方法一:双层for循环判断,时间复杂度(O( mn ))
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0 || matrix[0].size() == 0) return false ;
for(int i = 0 ; matrix[0][i] <= target ; i ++){
for(int j = 0 ; matrix[j][i] <= target ; j ++){
if(matrix[j][i] == target)
return true ;
if(j + 1 == matrix.size())
break ;
}
if(i + 1 == matrix[0].size())
break ;
}
return false ;
}
};
方法二:单层循环,时间复杂度(O( m + n ))
思路:二维矩阵(假设4*4,数据如下)
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
思考寻找11时的过程:若方法一,则从第一列向下找,到13结束,然后第二列 14 结束,之后第三列,找到11.。。。。
时间复杂度较大:
换种方法让其最多一行一列的元素:
也就是从第一行开始,但从最后一列开始
同样是11,与4比较,比4大,则11一定不在第一行==》i ++
与8 比较 ==》 i ++
与12比较,11 < 12 ,则 j -- ,找到 11 ,找10 的话再 j -- ,就能返回true
代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0) return false ;
int i = 0 , j = matrix[0].size() - 1 ;
while( i < matrix.size() && j >= 0){
if(matrix[i][j] == target)
return true;
else
if(matrix[i][j] < target)
i ++ ;
else
j -- ;
}
return false ;
}
};