剑指 offer 面试题精选图解 04 . 二维数组中的查找 (超详细超容易理解的动画解法!!!)...

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 04 . 二维数组中的查找

题目链接:leetcode-cn.com/problem

更多题目动画讲解:algomooc.com

一、题目描述

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

二、题目解析

仔细观察矩阵,可以发现:左下角元素 为所在列最大元素,所在行最小元素

如果 左下角元素 大于了目标值,则目标值一定在该行的上方, 左下角元素 所在行可以消去。

如果 左下角元素 小于了目标值,则目标值一定在该列的右方, 左下角元素 所在列可以消去。

具体操作为从矩阵左下角元素开始遍历,并与目标值对比:

  • matrix[i][j] > target 时: 行索引向上移动一格(即 i--),即消去矩阵第 i 行元素;
  • matrix[i][j] < target 时: 列索引向右移动一格(即 j++),即消去矩阵第 j 列元素;
  • matrix[i][j] == target 时: 返回 true。
  • 如果越界,则返回 false。

三、动画描述

四、图片描述


v2-a9617925a1fbad00acf2d41198085c3a_b.jpg



v2-ad0ec95ff08e9c361b3217f3bca09b9c_b.jpg



v2-907bb6ab936644ccbe1c8b67db9f3c01_b.jpg



v2-f147124d851de352db515c99de4aef5f_b.jpg



v2-03ff4a68d9998031414ae5ed493c4660_b.jpg



v2-e2af4ebbb6b1f738c0c42ccc474d2f00_b.jpg



v2-9a7ef2624a266e08a42ff1d8013556ac_b.jpg



v2-f40dad41562a96e9057f7d03ee97d0a3_b.jpg



v2-dc82a5792789e27b924ef45c50428ec1_b.jpg



v2-13f8fe19e090dce9052588b85535b0c5_b.jpg



v2-4fe59901d918541fff0d1054f828040f_b.jpg



v2-ab25127a9d7b984e7f2628b76fcc15f5_b.jpg



v2-18af0f7922400a9bee695236b3eec22a_b.jpg



v2-3b7c8fc05ffa3bcfe4e567da3582ab6c_b.jpg



v2-3ee4a49fa394d9b52f5a64e5e084f6c3_b.jpg



v2-2585bc9834ab5849e62b31d3552e6472_b.jpg



v2-d797414ebeb4eed3b1d231d0bd5bc2be_b.jpg



v2-1228b1aca2adc1db6d48a26a7052f27f_b.jpg



v2-df73125b641534937cf549593ff513ef_b.jpg


五、参考代码

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        //初始化 i 和 j 为数组左下角元素
        int i = matrix.length - 1, 
        int j = 0;
        //如果 i 和 j 没有越界继续判断
        while(i >= 0 && j < matrix[0].length){

            if(matrix[i][j] > target){
                //行索引向上移动一格(即 i-- ),即消去矩阵第 i 行元素
                i--;
            }else if(matrix[i][j] < target){
                //列索引向右移动一格(即 j++ ),即消去矩阵第 j 列元素
                j++;
            }else{
                //找到目标值,直接返回 ture
                return true;
            }     
        }
        //没有找到目标值,返回 false
        return false;
    }
}

六、复杂度分析

时间复杂度

时间复杂度为 O(M+N),其中,N 和 M 分别为矩阵行数和列数,此算法最多循环 M + N 次。

空间复杂度

空间复杂度为 O(1)。

七、相关标签

  • 数组
  • 双指针
  • 二分法

更多题目动画讲解:

AlgoMooc-一个专属于程序员的平台,和大家一起刷题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值