题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
当我们需要解决一个复杂的问题时,一个很有效的办法就是从一个具体的问题入手,通过分析简单具体的例子,试图寻找普遍规律。针对这个问题,我们不妨也从题目给出的例子入手。
首先我们选取右上角的数字9。由于9大于7,并且9还是第四列中最小的数字,因此7不可能出现在第四列。于是,我们把这一列从需要考虑的区域内剔除。在剩下的矩阵中,位于右上角的数字是8。同样8大于7,因此8所在的列我们也可以剔除。
在剩余的两列中, 2位于右上角,2小于7,那么要查找的7只可能在2的下边。于是我们把2所在的行也剔除。在剩下的矩阵中,4位于右上角,和前面一样,我们把数字4所在的行也剔除。
在剩下的2*2矩阵中,位于右上角的恰好就是我们要查找的数字7,于是查找过程就可以结束了。
总结上述查找过程,可以发现:首先选取数组右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除该数字所在的列;如果该数字小于要查找的数字,则剔除该数字所在的行。直到找到要查找的数字,或者要查找的范围为空。
bool Find(vector<vector<int> > array, int target) {
bool found = false;
if (!array.empty())
{
int rows = array.size();
int cols = array[0].size();
if (rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;
while (row < rows && col >= 0)
{
if (array[row][col] == target)
{
found = true;
break;
}
else if (array[row][col] > target)
--col;
else
++row;
}
}
}
return found;
}