数组 | 二维数组中的查找 | 117518 | 23.46% |
时间限制:1秒 空间限制:32768K 热度指数:933761
本题知识点: 查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法1 O(nlogn)
枚举+二分。最容易想到的也是最简单的。再加一点小优化。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int len;
for(int i=0;i<array.size();i++)
{
len=array[i].size();
if(len>0 && array[i][0]<=target && array[i][len-1]>=target)
if(*lower_bound(array[i].begin(),array[i].end(),target)==target)
{
return 1;
}
}
return 0;
}
};
方法二 O(n+m)
因为都是排序的,所以先用target与最后一列第一个进行比较,此时分为两种情况,若大于,则第一排不用找,若小于,则,最后一列不用找。 (理论上应该是最快的方法了吧)
顺便吐槽一下剑指offer的数据:数据量过小怎么样都能过,而且体现不出复杂度的区别,甚至高复杂度代码(代码简单)比低复杂度的代码(代码复杂)结果出的都快。很操蛋。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int len=array.size();
int x,y,t;
y=0;
x=array.size()-1;
while(1)
{
if(x<0 || y==array[0].size())
{
return 0;
}
t=array[y][x];
if(t==target)
return 1;
if(target<t)
{
x--;
}
else
y++;
}
return 0;
}
};