Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
For example,
Consider the following 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] ]
Given target = 5
, return true
.
Given target = 20
, return false
.
搜索一个二维矩阵:
输入一个m x n的矩阵 和一个 target,判断target是否在该矩阵中
其中:每一行的元素是顺序的,每一列的元素也是顺序的。
最简单的办法当然是:搜索全部mn个元素,若发现存在与target相同的元素就返回true,全部遍历完毕未发现就返回false。
时间复杂度为O(m*n)
而在下是用的方法,时间复杂度为O(2n+m-2)
利用数组是已排序的特性。下面用图说明,比如寻找17(在矩阵中存在),箭头表示搜索顺序。
再比如寻找20(在矩阵中不存在)
可以看到除了第一行中存在向右的搜索以外,其余各行都没有。
且不存在向上的箭头。
由此可以得出最差情况即:
第一行搜索至最后一个元素,目标元素在最后一行的第一个元素。
如此共执行2n+m-2次。
我觉得看了图应该就能懂了,方法就不具体说了
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if(m == 0) {
return false;
}
int n = matrix[0].size();
if(n == 0) {
return false;
}
int i = 0, j = 0;
if(target < matrix[i][j]){
return false;
}
if(target == matrix[i][j]){
return true;
}
bool flag = 1;//是否能向右
while(1) {
if(flag && i + 1 < m && target >= matrix[i+1][j]) {
if(target == matrix[i+1][j]){
return true;
}
i++;
continue;
}
else if(j + 1 < n && target >= matrix[i][j+1]) {
if(target == matrix[i][j+1]){
return true;
}
j++;
}
else{
if(i - 1 >= 0){
i--;
flag = 0;
continue;
}
else{
return false;
}
}
}
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if(m == 0) {
return false;
}
int n = matrix[0].size();
if(n == 0) {
return false;
}
int i = 0, j = 0;
if(target < matrix[i][j]){
return false;
}
if(target == matrix[i][j]){
return true;
}
bool flag = 1;//是否能向右
while(1) {
if(flag && i + 1 < m && target >= matrix[i+1][j]) {
if(target == matrix[i+1][j]){
return true;
}
i++;
continue;
}
else if(j + 1 < n && target >= matrix[i][j+1]) {
if(target == matrix[i][j+1]){
return true;
}
j++;
}
else{
if(i - 1 >= 0){
i--;
flag = 0;
continue;
}
else{
return false;
}
}
}
}
};