二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30],
];
给定 target = 5,返回 true。给定 target = 20,返回 false。
限制:0 <= n <= 1000
1.暴力解法:
利用两个循环遍历,再判断是否有值,如果相等则返回 true 并终止循环
function findNumberInArray(matrix,target){
if(matrix && target){
for(let i = 0; i < matrix.length; i++){
for(let j = 0; j<matrix[i].length;j++){
let item = matrix[i][j]
if(item === target) return true
}
}
return false
}else{
return false
}
}
- 时间复杂度:O(n * m)
- 空间复杂度:O(1)
2. 线性算法:
从题目已知
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序
,因此可以通过target和行的最后一个数进行对比,若target小于行的最后一个数,则列减一,若大于则行加一
function findNumberInArray(matrix,target){
if(matrix && target){
let rows = matrix.length, cols = matrix[0].length
let i = 0, j = cols -1
while(i < rows && j >= 0){
if(matrix[i][j] === target) return true
if(matrix[i][j] > target){
j--
}else{
i++
}
}
return false
}else{
return false
}
}
- 时间复杂度:O(n + m)
- 空间复杂度:O(1)