问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
问题分析:
1.我们可以先假设一个简单的二维数组及整数(如下图),以此为例来找到解决问题的思路。
2.乍一看问题,可能会觉得很简单,因为一个双重for()循环就可以轻易的得到答案,可惜的是时间复杂度是O(N^2),所以这一思路会很自然的被系统自动舍弃,还是开动开动脑筋吧!
由问题描述可知,数组的排列规则为:每一行(row)都按照从左到右递增的顺序排序,每一列(col)都按照从上到下递增的顺序排序。那么我们是不是可以试一下用最左下角的数字开始比较呢?或许可以试试!
由数组知最左下角的数字为7,用7与整数3做比较自然是7比较大。由规则得7所在的行每一个数字都比整数3大,而7所在的列每一个数字都可能比整数3小,所以应将行减1(即--row)后再与整数3进行判断。由于4大于整数3,故应再将行减1,让1与整数3做比较。用1与整数3做比较自然是整数3比较大。由规则得1所在的行每一个数字都可能比整数3大,所以应将列减1(即--col)后再与整数3进行判断。按照上述逻辑即可判断出数组中含有该整数。
源代码如下:
bool Find(int target, vector<vector<int> > array) {
int row=array.size(); //行
int col=array[0].size(); //列
int i=row - 1;
int j=0;
while(i>=0 && j<=col-1)
{
if(array[i][j] > target)
{
--i;
}
else if(array[i][j] < target)
{
++j;
}
else
{
return true;
}
}
return false;
}