美文网首页Web前端之路
【剑指Offer for JS】查找二维数组中指定的值

【剑指Offer for JS】查找二维数组中指定的值

作者: 灵活的胖墩 | 来源:发表于2020-07-09 00:47 被阅读0次

    题目描述

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

    例如:下方的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组中不含有该数字,则返回false

    1 2 8  9
    2 4 9  12
    4 7 10 13
    6 8 11 15
    

    解题

    穷举法

    最简单粗暴的方式,依次遍历数组中各个元素即可。

    function findInMatrixExhaustive(matrix: number[][], target: number): boolean {
      for (let rowIndex = 0; rowIndex < matrix.length; rowIndex++) {
        for (let colIndex = 0; colIndex < matrix[rowIndex].length; colIndex++) {
          const current = matrix[rowIndex][colIndex];
          if (current === target) {
            return true;
          }
        }
      }
    
      return false;
    }
    

    使用现有API进行查找

    此种方式可以算是第一种方法的变体,但利用现有API可以一定程度上精简代码

    function findInMatrixWithApi(matrix: number[][], target: number): boolean {
      return matrix.flatMap(item => item).includes(target);
    }
    

    双索引查找

    此种方式在时间复杂度上会优于前2种方式,利用行和列索引的移动来逐步查找目标值。

    通过题干给出的信息,我们可以得知行和列都保持有序,挑选矩阵中任一元素(element)与目标值(target)进行对比,会出现以下三种情况:

    1. element > target,则目标值可能出现的位置一定在element的左侧和上方;
    2. element < target,则目标值可能出现的位置一定在element的右侧和下方;
    3. element = target,则说明命中目标值。
    target-element.png

    通过上面的辅助图我们可以看到target可能出现的地方出现了重叠,那么有没有什么方法对这种情况进行简化呢?

    我们尝试把element移动到矩阵的右上角,这时候你会发现,重叠的部分消失了!

    target-element-no-overlap.png

    此时,elementtarget的关系被简化为以下情况:

    1. element>target,则target一定出现在element的左侧;
    2. element<target,则target一定出现在element的下方;
    3. element=target,则说明命中目标值。

    我们将上述的方法带入到例题中,会得到如下过程:

    target-element-result.png

    最终,我们匹配到了相应元素,匹配成功。

    在匹配过程中,若行索引超出最大行数或列索引小于0,则说明整个矩阵中未包含目标元素,匹配失败。

    function findInMatrix(matrix: number[][], target: number): boolean {
      const rowSize = matrix.length;
      const columnSize = matrix[0].length;
    
      if (rowSize === 0) {
        return false;
      }
    
      let row = 0;
      let col = columnSize - 1;
    
      while (row < rowSize && col >= 0) {
        const current = matrix[row][col];
    
        if (current === target) {
          return true;
        }
    
        if (current > target) {
          --col;
        } else {
          ++row;
        }
      }
    
      return false;
    }
    

    相关文章

      网友评论

        本文标题:【剑指Offer for JS】查找二维数组中指定的值

        本文链接:https://www.haomeiwen.com/subject/uajhcktx.html