题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
首先会想到暴力查找,不过如果题目的最优解法是暴力查找的话,那就不叫面试题了。于是有了以下解法,虽然解法不一定是最优,但肯定大大优于暴力解法。
假如我们查找的元素是12,首先考察每一行最右侧的元素,如果该元素小于12,则该元素所在的行便不予考察了,因为他们都小于12了,如图所示。
如果找到了大于12的元素,那么我们就需要横向考察了,如果此时右上角的元素(也就是13)大于12,那么就要横向缩减,因为13所在的列有效元素肯定都比13大了。
就这样按照上面 两步操作不断缩减考察区域,同时不断考察右上角元素是否为我们要查找的元素,如果是则结束查找,返回true;否则一直查找,查找不到则返回false。
AC代码
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if (array.empty())
return false;
int i = 0;
int j = array[0].size()-1;
while (i<array.size() && j >= 0) //循环条件
{
if (array[i][j] == target)
return true;
else if (array[i][j]<target)
i++;
else //array[i][i] > target
j--;
}
return false;
}
};