1. 问题描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
2.问题分析
- 方法一:每行每列的查找每个数字,有点简单,但是没有效率;
- 方法二:根据二维数组的特性,可以选择从右上角或者左下角的元素做比较。例如:
1 2 3 (4)
2 3 4 5
3 4 5 6
4 5 6 7
从(0,3)元素即4开始,
1.如果我们要找的数是7,那么我们发现7大于4,那么要找的数应该是4的下面;
2.如果找的数是3,那么我们发现3小于4,那么要找的数只能在4的左边。
同理,如果我们从左下角开始也是这样,(3,0)即4开始也是一个道理
3.代码
bool Find(int target, vector<vector<int> > array) {
//判断行和列是否是0
int rows = array.size();
if(rows <= 0)
return false;
int cols = array[0].size();
if(cols <= 0)
return false;
int x = 0,y = cols - 1;
//边界检查,如果为了读懂,可以写成:
// x >= 0 && x < rows && y >=0 && y < cols
while(x < rows && y >= 0)
{
if(target == array[x][y])
return true;
else if(target > array[x][y])
++x;
else
--y;
}
return false;
}