二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

点击关注上方“图解面试算法”,

设为“置顶或星标”,一起刷 LeetCode。

589ce60146d7a5ece92787715050e468.png 作者:程序员吴师兄

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

题目链接: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

二、题目解析

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

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

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

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

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

三、动画描述

四、图片描述

717037f21162f118756fe835b8341fff.png
面试题04. 二维数组中的查找.001
da0714ff8ee59ebef9b17fc338b1b0c5.png
面试题04. 二维数组中的查找.002
8c3ea46532b66a0c98c76dedbd76a1ad.png
面试题04. 二维数组中的查找.003
899a16413f24841a8518948c30cc0dc9.png
面试题04. 二维数组中的查找.004
2ddef9cbaac5601e34d45ff3f52255b7.png
面试题04. 二维数组中的查找.005
8bb4ab8444f1c5f3237455652a8e4c2e.png
面试题04. 二维数组中的查找.006
1c12e11943d52b4e7e32f67517d76c56.png
面试题04. 二维数组中的查找.007
b67517fc79cb47e86f017d31f8f09be3.png
面试题04. 二维数组中的查找.008
a37a6671f74a8150d11299739fb9d161.png
面试题04. 二维数组中的查找.009
d806e61d9169c935dfb3e6789a77dca0.png
面试题04. 二维数组中的查找.010
be2c900978cf85ac76a2a45b94e56f47.png
面试题04. 二维数组中的查找.011
8f6b05346400618b96c4981c27ea7a95.png
面试题04. 二维数组中的查找.012
288dc37def8ebd8c48ad95b4a3941016.png
面试题04. 二维数组中的查找.013
7f913f308ff020727c8de4b4a88449f9.png
面试题04. 二维数组中的查找.014
b9130b487d274f341022e53a54419c01.png
面试题04. 二维数组中的查找.015
35024b1e248ef1101bd783dd5b288109.png
面试题04. 二维数组中的查找.016
234ce7a0f9ed577715700f237ada8b0c.png
面试题04. 二维数组中的查找.017
66f3a85a37575d44150e7142417d84a3.png
面试题04. 二维数组中的查找.018
ca2396ffde26f39619ceb0cd272545ba.png
面试题04. 二维数组中的查找.019

五、参考代码

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

六、复杂度分析

时间复杂度

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

空间复杂度

空间复杂度为 O(1)。

七、相关标签

  • 数组

  • 双指针

  • 二分法

欢迎关注我的公众号“图解面试算法”,如果喜欢,麻烦点一下“在看”,转发+在看相当于打赏!

85a428f9446a53d0ce02b471f84dec83.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值