一、题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个 整数,判断数组中是否含有该整数。
例如下面二维数组就是每行、每列都是递增序列,如果在这个数组中查找数字7,则返回true; 如果查找数字5, 由于数组不含有该数字,则返回false。
$$ \begin{matrix} 1 & 2 & 8 & 9\\ 2 & 4 & 9 & 12 \\ 4 & 7 & 10 & 13 \\ 6 & 8 & 11 & 15 \end{matrix} \tag{1}$$
二、解法
思路:假设要查找7。 首先我们选取数组右上角的数字9, 由于9大于7,并且9还是第4列的第一个(也是最小的)数字,因此7不可能出现在数字9的列。于是我们把这一列从需要考虑的区域中提出,之后只需要分析剩下的3列。再生侠的矩阵中,位于右上角的数字是8。同样8大于7,因此8所在的列也可以剔除, 在剩下的两列组成的数组中,数字2位于数组的右上角。2小于7,那么要查找的7可能在2的右边,也可能在2的下边。在前面的步骤中,我们已经发现2右边的列都已经被剔除了,也就是说7不可能出现在2的右边,因此7只能出现在2的下面,于是我们把2所在的行剔除,值分析剩下的三行两列数字,在剩下的数字中4位于右上角,和前面一样,把数字4所在的行删除,剩下两行两列数字。再剩下的数字中,位于右上角的刚好就是我们要查找的7,于是查找过程结束,返回true。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
// array是二维数组,这里没做判空操作
int rows = array.size();
int columns = array[0].size();
int i = 0, j = columns-1;//右上角元素坐标
while(i<rows && j>=0)
{
if(array[i][j] == target)
return true;
else if(array[i][j] > target)
--j; //查找的元素小于右上角元素,删列操作
else
++i; //查找的元素大于右上角元素,删行操作
}
return false;
}
};