• 剑指offer——二维数组中的查找


    链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof

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

    题解1

    解题思路

    一行代码!!!

    Array.prototype.flat()用于将嵌套的数组拉平,变成一维数组,返回新数组。

    [1, 2, [3, 4]].flat()
    // [1, 2, 3, 4]
    

    Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值。

    [1, 2, 3].includes(2)     // true
    [1, 2, 3].includes(4)     // false
    

    代码

    var findNumberIn2DArray = function(matrix, target) {
       return matrix.flat().includes(target);
    };
    

    题解2

    解题思路

    尽量减少比较次数,减少循环

    获取一行数组的长度m,题目说的是n*m,那么m应该是一个固定值。

    先遍历每一行数组,因为每行都是升序,所以就比较首位两个元素即可,找出v[0] <= target && v[m - 1] >= target这种情况的,就表明target可能会在这一行。

    然后使用二分查找,找出是否有目标值。

    代码

    /**
     * @param {number[][]} matrix
     * @param {number} target
     * @return {boolean}
     */
    var findNumberIn2DArray = function(matrix, target) {
        //排出[]和[[]]这种情况
         if (matrix.length === 0 || matrix[0].length === 0)
            return 0;
      //题目说的是n*m,那么m应该是一个固定值
      let m = matrix[0].length;
      for (v of matrix) {
        //进行首尾比较
        if (v[0] <= target && v[m - 1] >= target) {
          //进行二分查找
          let min = 0;
          let max = m;
          let mid;
          while (mid != min && mid != max) {
            mid = parseInt((max + min) / 2);
    
            if (target > v[mid]) {
              min = mid + 1;
    
            } else if (target < v[mid]) {
              max = mid - 1;
            } else if (target === v[mid]) {
              //找到,返回结果
              return true;
            }
    
          }
        }
      }
    
      //没找到,返回结果
      return false;
    };
    

    一行代码不香吗!

  • 相关阅读:
    IE8上传插件jquery-form.js上传请求参数设置type为post失效问题
    路径参数汉字兼容问题
    vue-cli2移动端适配
    事件委托原生、jQuery实现
    new Date()在移动端的问题
    create-react-app配置less
    删除左右两边空格
    日期转换
    Git 常用命令
    单页面应用
  • 原文地址:https://www.cnblogs.com/ellen-mylife/p/13276506.html
Copyright © 2020-2023  润新知