一、题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、代码实现
1.思考过程
要求时间复杂度O(M+N),空间复杂度O(1)。其中M为行数,N为列数。该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角或左下角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角或右上角的所有元素。
2.代码实现
代码如下(示例):
bool Find(int target, vector<vector<int>> array)
{
int rows = array.size();
if (row == 0)
return false;
int cols = array[0].size();
if (cols == 0)
return false;
int row = rows - 1;
int col = cols - 1;
while (row >= 0 && col < cols)
{
if (array[row][col] < target)
++col;
else if (array[row][col] > target)
--row;
else
return true;
}
return false;
}
总结
- 考查对二维数组的理解及编程能力。二维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。
- 考查分析问题的能力。当发现问题比较复杂时,能不能通过具体的例子找出其中的规律,是能否解决这个问题的关键所在。