二维数组中的查找
描述
??在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0≤n,m≤500,矩阵中的值满足 0 \le val \le 10^90≤val≤109 进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
思路/解法
方式一
以行为单位,判断target是否满足:target>=matrix[i][0]&&target<=matrix[i][matrixW-1],满足则使用二分查找,不满足则i++后循环反复判断比较。
class Solution {
public:
bool BinaryLook(vector<int> arr,int target)
{
int start = 0;
int end = arr.size()-1;
while(start<=end)
{
int mid = (start+end)/2;
if(arr[mid] > target)
end = mid - 1;
else if(arr[mid] < target)
start = mid + 1;
else
return true;
}
return false;
}
bool Find(int target, vector<vector<int> > array) {
if(array.empty() || (array.size() == 1 && array[0].empty()))return false;
bool flag = false;
for(int i = 0;i<array.size();i++)
{
if(target>= array[i][0] && target <= array[i][array[i].size()-1])
{
if(BinaryLook(array[i],target))
{
flag = true;
break;
}
}
}
return flag;
}
};
方式二
矩阵是有序的,从左下角开始看,向上数字递减,向右数字递增。因此从左下角开始查找,当要查找数字比左下角数字大时,右移。要查找数字比左下角数字小时,上移。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty() || (array.size() == 1 && array[0].empty()))return false;
int row = array.size();
int col = array[0].size();
for(int i = row-1,j = 0;i>=0&&j<col;)
{
if(target == array[i][j])
return true;
if(target > array[i][j])
{
j++;
continue;
}
if(target < array[i][j])
{
i--;
continue;
}
}
return false;
}
};
|