剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int m = matrix.size();//行数
int n = 0;
if (m > 0)
{
n = matrix[0].size();
}
int i = 0;
for (int j = n - 1; j >= 0;)
{
int com = matrix[i][j];
if (target>com)
{
i++;
if (i>=m)
{
break;
}
}
else if (target < com)
{
j--;
if (j < 0)
{
break;
}
}
else
{
return true;
}
}
return false;
}
};
时间复杂度为O(n+m),空间复杂度为O(1),对于左上角的元素,左边是比它小的数,下边是比它大的数,所以顶多移动n+m次,n是列数,m是行数
class Solution {
public:
//一维数组二分法找目标值
bool findMatrix(vector<int>& ma, int target)
{
int m = 0, n = ma.size() - 1;
while (m <= n)
{
int middle = (m + n) / 2;
if (ma[middle] < target)
{
m = middle + 1;
}
else if (ma[middle] > target)
{
n = middle - 1;
}
else
{
return true;
}
}
return false;
}
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int n = matrix.size();
if (n > 0)
{
int m = matrix[0].size();
}
for (int i = 0; i < n; i++)
{
if (findMatrix(matrix[i], target))
{
return true;
}
}
return false;
}
};
二分法,每一行当做一个数组,对其进行二分法查找,所以时间复杂度为
O(m*logn),m为行数,n为列数