剑指offer1_二维数组中的查找_题解
二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例1
输入
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true
分析
方案一:二分
数组每一行均为有序数组,满足使用二分查找的前提条件
依次对数组每一行进行二分查找,若找到则返回true,遍历完所有行均未找到则返回false
代码
/**
复杂度分析
1.时间复杂度:O(nlogn)
2.空间复杂度:O(1)
**/
bool Find(int target, vector<vector<int>> array)
{
int rows = array.size();//rows:数组行数
// 依次对数组每一行进行二分查找
for(int i = 0; i < rows; i++){
// 若待查找元素在第i行找到,则提前终止查找,返回true; 否则继续查找下一行
if(binary_search(array[i].begin(), array[i].end(), target)){
return true;
}
}
// 若待查找元素在所有行中都未找到,则返回false
return false;
}
方案二:利用数组性质
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序
从矩阵的左下角看,上方的数字都比其小,右方的数字都比其大
设当前数字为 cur,目标数字为 target
-
当 target < cur 时,行数减1,cur 更新为其上面一行的数字
-
当 target > cur 时,列数加1,cur 更新为其右侧一列的数字
-
当 cur == target 时则返回 true
-
否则当行数或列数超过矩阵边界时返回 false
代码
/**
复杂度分析
1.时间复杂度:O(m+n)
2.空间复杂度:O(1)
**/
bool Find(int target, vector<vector<int>> array)
{
int rows = array.size();//rows:数组行数
int cols = array[0].size();//cols:数组列数
int i = rows - 1, j = 0;//i:行坐标,j:列坐标,初始位置为左下角元素
while (i >= 0 && j < cols)
{
int cur = array[i][j];
// 当 target < cur 时,行数减1,cur 更新为其上面一行的数字
if (target < cur)
{
i--;
}
// 当 target > cur 时,列数加1,cur 更新为其右侧一列的数字
else if (target > cur)
{
j++;
}
// 当 cur == target 时返回 true
else
{
return true;
}
}
// 当行数或列数超过矩阵边界时返回 false
return false;
}