zoukankan      html  css  js  c++  java
  • 剑指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;
    };
    

    一行代码不香吗!

  • 相关阅读:
    Linux 禁用笔记本触摸板
    Linux 下安装android
    关于JAVA多线程的那些事__初心者
    ADT下开发环境的配置--个人配置啦 Eclipse Color Themes
    关于权限系统的一些思考
    关于线程安全的单例模式的讨论
    说下Fedora下把SpiderMonkey放入Eclipse内编译的过程
    基于Eclipse构建Hadoop源码阅读环境
    Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
    CentOS6.5安装配置
  • 原文地址:https://www.cnblogs.com/ellen-mylife/p/13276506.html
Copyright © 2011-2022 走看看