[ 国庆节不停更 ] 二维数组中的查找

573 阅读2分钟

目录

  1. 题目说明:矩阵中查找元素
  2. 暴力法查找
  3. 规律查找
  4. 递归查找
  5. 参考

一 题目说明:矩阵中查找元素

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

现有矩阵 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

参考