目录
题目:JZ4 二维数组中的查找
在一个二维数组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≤val≤10^9
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
题解1:暴力破解
- 思路:两次遍历循环该矩阵,查找是否存在target
- 代码
function Find(target, array)
{
// write code here
const n = array.length,
m = array[0].length;
for(let i=0;i<n;i++){
for(let j=0;j<m;j++){
if(target == array[i][j]){
return true;
}
}
}
return false;
}
- 复杂度分析:
- 时间复杂度:O(MN)
- 空间复杂度:O(1)
题解2:线性搜索
- 思路:利用二位数组行列递增特性
- 由于行列递增,可以得出:
- 1.在一列中的某个数字,其上的数字都比它小
- 2.在一行中的某个数字,其右的数字都比它大
- 搜索流程:
- 1.首先从数组左下角搜索.
- 2.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
- 3.查找到target,返回true; 如果越界,返回false;
- 由于行列递增,可以得出:
- 代码:
function Find(target, array) {
// write code here
const n = array.length,
m = array[0].length;
let row = n - 1,
col = 0;
if (m === 0 && n === 0) {
return false;
}
while (row >= 0 && col < m) {
if (array[row][col] > target) {
row--;
}
else if(array[row][col] < target){
col++;
}
else{
return true;
}
}
return false;
}
- 复杂度分析:
- 时间复杂度:O(M+N)
- 空间复杂度:O(1)
总结
- 本题虽然可以用暴力破解解决,但是根除题目的特性还可以使用利用矩阵的特性(线性)进行线性搜索。