题目描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解答
1. 暴力(不是我的第一想法)它不高效
2.二分查找 发现想法错误
3. 以每个正方形的右下角为一组(他是最大的,判断范围,如果比它小,范围也很大,不只是横竖两条)[直接在编辑器上眼睛debug的,有点凌乱]
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if (matrix.size()==0) return false;
if (matrix[0].size()==0) return false;
int i=0,j=0;
int m=matrix.end()-matrix.begin();
int n=(matrix[0]).end()-(matrix[0]).begin();
if (m>=n)
{
i=0;
auto a=matrix.begin()+i;
auto b=(*a).begin()+i;
while (*b<target && i<n)
{
i++;
if (i<n)
{
a=matrix.begin()+i;
b=(*a).begin()+i;
}
}
if (i==0)
{
if (*b==target)
return true;
return false;
}
else
{
while (i<n)
{
a=matrix.begin()+i;
b=(*a).begin()+i;
if (*b==target)
return true;
for (auto k=(*a).begin();k!=(*a).begin()+i; k++)
{
if (*k==target)
return true;
}
for (auto k =matrix.begin();k!=matrix.begin()+i; k++)
{
if (*((*k).begin()+i)==target)
return true;
}
i++;
}
if (m==n) return false;
i=n;
a=matrix.begin()+i;
b=(*a).begin()+i-1;
while (*b<target && i<m)
{
i++;
if (i<m)
{
a=matrix.begin()+i;
b=(*a).begin()+n-1;
}
}
while (i<m)
{
a=matrix.begin()+i;
b=(*a).begin()+n-1;
if (*b==target)
return true;
for (auto k=(*a).begin();k!=(*a).begin()+n; k++)
{
if (*k==target)
return true;
}
i++;
}
return false;
}
return false;
}
else
if (m<n)
{
i=0;
auto a=matrix.begin()+i;
auto b=(*a).begin()+i;
while (*b<target && i<m)
{
i++;
if (i<m)
{
a=matrix.begin()+i;
b=(*a).begin()+i;
}
}
if (i==0)
{
if (*b==target)
return true;
else return false;
}
else
{
while (i<m)
{
a=matrix.begin()+i;
b=(*a).begin()+i;
if (*b==target)
return true;
for (auto k=(*a).begin();k!=(*a).begin()+i; k++)
{
if (*k==target)
return true;
}
for (auto k =matrix.begin();k!=matrix.begin()+i; k++)
{
if (*((*k).begin()+i)==target)
return true;
}
i++;
}
i=m;
a=matrix.begin()+i-1;
b=(*a).begin()+i;
while (*b<target && i<n)
{
i++;
if (i<n)
{
a=matrix.begin()+m-1;
b=(*a).begin()+i;
}
}
while (i<n)
{
a=matrix.begin()+m-1;
b=(*a).begin()+i;
if (*b==target)
return true;
for (auto k=matrix.begin();k!=matrix.end(); k++)
{
if (*((*k).begin()+i)==target)
return true;
}
i++;
}
return false;
}
return false;
}
return false;
}
};
错误记录
1. vector指示器的指代问题
2. 二分边界问题
3. 边界
if (matrix.size()==0) return false;
if (matrix[0].size()==0) return false;
4. 发现了自己理解的Bug,