二维数组中的查找
题目描述:
- 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路一:
- 首先选取数组中右上角数字,如果这个数字等于我们所要查找的数字,那么就结束查找的过程,如果说这个数字大于要查找的数字,那么就删除这个数字所在的这一行,如果这个数字小于我们所要查找的数字,那么我们就删除这个数字所在的行,也就是是说,我们每一次的比较都可以剔除一行或者一列的元素,这样每一步都可以缩小搜索的范围,一直到我们找到我们所要查找的元素,如果没有找到的话,返回false就可以了
代码如下:
class Solution {
public:
bool Find(int target, vector<vector<int> > array)
{
int rows=array.size()-1;
int cols=array[0].size()-1;
int i=0,j=cols;
while(i<=rows&&j>=0)
{
if(array[i][j]==target)
return true;
else if(array[i][j]<target)
i++;
else if(array[i][j]>target)
j--;
}
return false;
}
};
测试用例
- 二维数组中包含索要查找的数字
- 二维数组中不包含所有查找的数字
- 无效的输入(比如说输入空指针)
解题思路二:
- 利用二分查找
- 每一行都按照从左到右递增的顺序排序,把每一行看作有序递增数组利用二分查找,通过遍历每一行查找得到答案,时间复杂度mlog(n),一行的二分查找的时间复杂度是log(n),m行的时间复杂度就是mlog(n)
代码如下:
class Solution {
public:
bool Find(int target, vector<vector<int> > array)
{
for(int i=0;i<array.size();i++)
{
int begin=0;
int end=array[0].size()-1;
while(begin<=end)
{
int mid=begin+(end-begin)/2;
if(target<array[i][mid])
end=mid-1;
else if(target>array[i][mid])
begin=mid+1;
else if(target==array[i][mid])
return true;
}
}
return false;
}
};