剑指Offer——二维数组中的查找(JS实现)

375 阅读1分钟

题目描述

解题思路(数学规律)

  • 本题主要是从二维数组的左下角的元素出发,不断的进行移动比较,因为本题给出的二维数组存在一个特点就是,从左小角的元素出发,一列的元素中,上面的元素总是比下面的元素小,一行的元素中,右边的元素总是比左边的大,这个特点就是我们解题的关键。

解题代码

var findNumberIn2DArray = function(matrix, target) {
    // ! 本题核心:以左下角为起始点,如果比左下角的数字小,向上移动一位进行比较
    // ! 如果比左下角的数字大,向右移动一位进行比较
    if (matrix.length === 0) return false;
    // if (matrix[0])
    // 定位到左下角元素
    let origin = matrix[matrix.length - 1][0];
    // 定义移动时的指针;
    let top = matrix.length - 1;
    let right = 0;
    // 定义最终返回的结果
    let res;
    while (1) {
        if (top < 0 || right === matrix[0].length) return false;
        origin = matrix[top][right];
        if (origin === target) return true;
        if (origin < target) {
            right++;
        }
        if (origin > target) {
            top--;
        }
    }
};
var searchMatrix = function(matrix, target) {
    // 搜索二维矩阵II和二维数组的查找是一个题目
    // 核心就是从左下角的元素开始进行查找
    // 一个元素上边的元素比它小,右边的元素比它大。

    // 如果二维数组为空,则target不存在,返回false
    if (matrix.length === 0) return false;

    // 定义两个指针
    let top = matrix.length - 1;
    let right = 0;

    while (1) {
      // 对边界条件进行校验
      if (top < 0 || right === matrix[0].length) return false;
      // 找到指针指向的元素
      let origin = matrix[top][right];
      if (origin === target) {
        return true;
      }
      if (origin > target) {
        top--;
      }
      if (origin < target) {
        right++;
      }
    }

};

总结(本题给我们的启示思路)

  • 启示:学会通过二维数组中的内在规律来解题。