【脚趾offer-04】二维数组的查找

简介: 【脚趾offer-04】二维数组的查找

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识。

一、题目描述

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

二、题目解析

仔细观察这个矩阵就可以发现:

  • 左下角的数值当前列数值最大的,当前行最小的

image.png

  • 所以如果target小于左下角的这个元素,那么最下面的一行就可以排除掉

image.png

  • 同理,如果target大于左下角的这个元素,那么最左边的这一列也可以排除掉

image.png

  • 将上述步骤不断迭代,直到找到目标值

image.png

三、AC代码

var findNumberIn2DArray = function(matrix, target) {
    const m = matrix.length
    if(m==0) return false
    const n = matrix[0].length
    let startJ = 0
    for(let i=m-1;i>=0;i--){
        for(let j=startJ;j<n;j++){
            if(matrix[i][j]==target){
                return true
            }else if(matrix[i][j]>target){ 
                // 舍弃最下面一行,列对应的下标不变
                break 
            }else if(matrix[i][j]>target){
                // 舍弃最左边的一列,行对应的下标不变
                startJ++
                break
            }
        }
    }
    return false
}; 

四、总结

好了,本篇脚趾offer 二维数组的查找到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。 借用鱼佬的一句话:不管菜不菜,但是热爱!


相关文章
|
6月前
剑指 Offer 04:二维数组中的查找
剑指 Offer 04:二维数组中的查找
31 0
|
6月前
剑指 Offer 53 - I:在排序数组中查找数字 I
剑指 Offer 53 - I:在排序数组中查找数字 I
38 0
|
6月前
|
Java
【剑指offer】-二维数组的查找-01/67
【剑指offer】-二维数组的查找-01/67
|
6月前
LeetCode(面试题:二维数组中的查找)
LeetCode(面试题:二维数组中的查找)
40 0
剑指offer-3.二维数组的查找
剑指offer-3.二维数组的查找
26 0
剑指Offer04二维数组中的查找
剑指Offer04二维数组中的查找
剑指offer_数组---二维数组中的查找
剑指offer_数组---二维数组中的查找
60 0
剑指offer 03. 二维数组中的查找
剑指offer 03. 二维数组中的查找
58 0
图解LeetCode——剑指 Offer 53 - I. 在排序数组中查找数字 I
图解LeetCode——剑指 Offer 53 - I. 在排序数组中查找数字 I
82 0