题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
第一种思路:暴力枚举
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for(int i = 0;i < array.size();++i)
{
for(int j = 0;j < array[i].size();++j)
{
if(array[i][j] == target)
return 1;
}
}
return 0;
}
};
第二种思路:由于是递增的关系,我们可以选择某个元素来进行搜索,但是选择的元素有什么要求吗?为了最优,应该保证所选的点是每一行的最末尾或者每一列的最末尾,因为递增,如果这个目标元素比所选的元素大,很显然我们就无需去遍历前面的元素,只需要移动到下一行或者下一列即可,如果小于只需要去搜这一行即可。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
//行数
int r = array.size();
//列数
int c = array[0].size();
//由于 是递增的,所以可以优化,可以选一个每行最末尾的或者每列最末尾的
//这样,如果大于只需要往下一行或者下一列移动,如果小于则只需要往其前一个位置移动
//我选择第一行的最后一个元素为搜索点
int i = 0,j=c-1;
//while循环的条件取决于你选择元素的位置,我选的是行末尾,所以需要保证j>=0
while(i < r && j >= 0)
{
if(target < array[i][j])
j--;
else if(target > array[i][j])
i++;
else
return 1;
}
return 0;
}
};