索引请参考:系列目录
题目:
-
在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
-
例:
-
输入:
-
查找:7 返回true 5 返回false
-
思路:
- 从此有序数组中选取一个数字,分三种情况:
- (1)当数组选取的数字刚好和要查找的数字相等时,结束查找过程
- (2)选取的数字小于要查找的数字,根据数组排序的规则,要查找的数字应该在当前 选取位置的右边或下边
- (3)选取的数字大于要查找的数字,要查找的数字应该在当前选取位置的上边或者左边
- 根以上三种情况,本题选择数组中右上的数字开始查询
- 从此有序数组中选取一个数字,分三种情况:
-
分析
-
(1)首先选取数组右上角的数字9,由于9>7,并且9位于第4列第一个(最小的),因此7不可能出现在此列,删除该列
-
(2)重复步骤(1)删除8所在的列
-
(3)由于2<7,所以有可能在该列
- 1)由于2<7,所以7不可能出现在该行,删除该行
- 2)重复步骤1)删除4所在的行
- 找到返回true
- 1)由于2<7,所以7不可能出现在该行,删除该行
-
(4)若没找到,返回false
bool findTwoDimensionalArrayElements(const int target, const std::vector<std::vector<int>> & array) {
int startX = array[0].size() - 1;
int startY = 0;
const int endY = array.size() - 1;
while (startX >= 0 && startY <= endY)
{
if (array[startY][startX] > target)
--startX;
else if (array[startY][startX] < target)
++startY;
else
return true;
}
return false;
}
牛客运行结果:
评注:该方法巧妙的利用了排序数组这一规律,将查找算法的时间大大缩小。