- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
目录
- 题目说明:
矩阵中查找元素 暴力法查找- 规律查找
- 递归查找
- 参考
一 题目说明:矩阵中查找元素
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
现有矩阵 matrix 如下:
var arr1 = [
[1,2,3],
[4,5,6],
[7,8,9]
];
给定 target = 5,返回 true
给定 target = 20,返回 false
二 暴力法 查找
遍历数组中的所有元素,找到是否存在。
时间复杂度是 O(N^2),空间复杂度是 O(1)
var arr = [
[1, 4, 7, 11, 13],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 22, 25, 37]
];
function findTargetInList(list, target){
if(list.length===0) return false
let rowLength = list.length;
let colLength = list[0].length;
for(let i=0; i< rowLength; i++){
for(let j=0; j<colLength; j++){
if(list[i][j] === target){
return true
}
}
}
return false;
};
findTargetInList(arr,2); // true
findTargetInList([],2); // false
findTargetInList([[],[]],1); // false
三 规律查找
时间复杂度是 O(M+N),空间复杂度是 O(1)。其中 M 和 N 分别代表行数和列数。
var findNumIn2DArr = function(matrix, target) {
if(matrix.length == 0)
return false;
let x = 0;
let y = matrix.length - 1;
while(x < matrix[0].length && y >= 0){
if(matrix[y][x] > target) {
y--;
} else if(matrix[y][x] < target) {
x++;
} else {
return true;
}
}
return false;
};
var arr1 = [
[1,2,3],
[4,5,6],
[7,8,9]
];
findNumIn2DArr(arr1,10); // false
四 递归查找
将二维数组看作平面坐标系, 从左下角(0,arr.length-1)开始比较:
- 目标值大于坐标值---x坐标+1
- 目标值小于坐标值---y坐标-1
var arr = [
[1, 4, 7, 11, 13],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 22, 25, 37]
];
function find(target, array) {
let i = array.length - 1; // y坐标
let j = 0; // x坐标
return compare(target, array, i, j);
}
function compare(target, array, i, j) {
if (array[i] === undefined || array[i][j] === undefined) {
return false;
}
const temp = array[i][j];
if (target === temp) {
return true;
}
else if (target > temp) {
return compare(target, array, i, j+1);
}
else if (target < temp) {
return compare(target, array, i-1, j);
}
}
find(21, arr); // true