二维数组的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
输入数组:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
如果输入查找数值为7,则返回true,
如果输入查找数值为5,则返回false。
思路一
设查找的数为y,每次都与最右上角的数比较,第一行最后一列的数为x,
如果x<y,则第一行的所有的数都小于y,删掉第一行;
如果x>y,则最后一列所有的数都大于y,删掉最后列;
时间复杂度O(m+n)=O(max(m, n))
class Solution {
public:
bool searchArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty())
return false;
int m = matrix.size(), n = matrix[0].size();
int i = 0, j = n-1;
while(i < m && j >= 0){
if(matrix[i][j] == target)
return true;
else if(matrix[i][j] < target)
++i;
else
--j;
}
return false;
}
};
思路二:分治法
将矩阵分为四块A B
C D
然后取中心点x,要查找元素为y
如果x < y,则y不可能在A
如果x > y,则y不可能在D
时间复杂度T(N) = T(N/2) + T(N/4) +O(1)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty() || matrix[0].empty()) return false;
int m = matrix.size(), n = matrix[0].size();
return find(matrix, 0, 0, m-1, n-1, target);
}
bool find(vector<vector<int> >&a, int x1, int y1, int x2, int y2, int target){
if (x1 > x2 || y1 > y2){
return false;
}
int midx = (x1 + x2) >> 1;
int midy = (y1 + y2) >> 1;
if(target == a[midx][midy]){
return true;
}
return (target < a[midx][midy]) ?
(find(a, x1, y1, midx-1, y2, target) || find(a, midx, y1, x2, midy-1, target)):
(find(a, x1, midy+1, x2, y2, target) || find(a, midx+1, y1, x2, midy, target));
}
};