剑指 Offer 31 天打卡计划】#11 二维数组中的查找

99 阅读1分钟

题目

难度:⭐️⭐️

在一个 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

0 <= m <= 1000

题解

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var findNumberIn2DArray = function(matrix, target) {
    if(!matrix.length) return false;
    let i = matrix.length-1
    let j = 0
    while(i>=0 && j<matrix[0].length){
        if(target === matrix[i][j]){
            return true
        }else if(target < matrix[i][j]){
            i = i-1
        }else{
            j = j+1
        }
    }
    return false
};

笔记

根据题意已知,二维数组从左往右递增,从上往下递增,所以得出以下结论:

某列的某个数字,该数之上的数字,都比其小; 某行的某个数字,该数右侧的数字,都比其大; 所以,解题流程如下所示:

以二维数组左下角为原点,建立直角坐标轴。 若当前数字大于了查找数,查找往上移一位。 若当前数字小于了查找数,查找往右移一位。