题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
函数原型
bool Find(int target, vector<vector<int> > array)
思路
1.最先想到的思路是自左向右,自上向下遍历array数组,如果在数组下标不越界的情况下能够找到与target相同的数,则return true,否则return false。但是此种方式较慢,时间复杂度为O(m*n)。
2.另一种方式是,从左下角第一个数开始遍历。对左下角第一个数而言,所有右边的数都比它大,所有上边的数都比它小。因此可以有以下算法:i设置为行下标,j设置为列下标。
由左下角第一个数开始遍历array。当i与j分别在行和列的范围内时:
当当前array中的数小于target时,说明应该在比当前的数大的数中寻找是否等于target的数,因此j++;
当当前array中的数大于target时,说明应该在比当前的数小的数中寻找是否等于target的数,因此i++;
如果当前的数等于target,return true。
如果i或j超过了行和列的范围,return false。
实现C++代码如下:
bool Find(int target, vector<vector<int> > array) {
if (array.empty()) { return false; }
int row = array.size();
int col = array[0].size();
int i=row-1, j=0;
while (i >= 0 && j < col) {
if (target < array[i][j]) { i--; }
else if (target > array[i][j]) { j++; }
else { return true; }
}
return false;
}