题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
第一种,刚开始用了二分查找,即在每一行用二分查找查看是否存在,算法复杂度为O(N*logN)
bool Find(int target, vector<vector<int>> array) {
for (auto & ary : array)
{
int left = 0, right = ary.size() - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (ary[mid] > target)
right = mid - 1;
else if (ary[mid] < target)
left = mid + 1;
else
return true;
}
}
return false;
}
第二种是根据给出的矩阵特性查找,在左下角或者右上角任意选择一个参考点,如选取右上角,在比较时如果比当前的数据大就说明肯定不在当前行,即在下一行找,如果比当前的数据小则说明不在当前列,即在前一列找,直到找出阶如果没有找到则说明不存在,其算法复杂度为O(n) (n + m)
bool Find(int target, vector<vector<int> > array) {
int size = array[0].size();
int row = 0;
int col = array.size() - 1;
while (size != 0 && row < size && col >= 0)
{
if (target > array[row][col])
{
++row;
}
else if (target < array[row][col])
{
--col;
}
else
{
return true;
}
}
return false;
}