数组越界如何解决_剑指 offer 面试题精选图解 04 . 二维数组中的查找

本文详细介绍了LeetCode上的剑指Offer系列问题——二维数组中的查找。通过分析矩阵特性,提出从左下角开始的双指针策略,逐行或逐列排除,最终找到目标值或确定其不存在。算法的时间复杂度为O(M+N),空间复杂度为O(1)。文章还附带了动画演示和代码实现。
摘要由CSDN通过智能技术生成

56e799f8b28f322acf335aee4b9d1b63.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。

三、动画描述

984f8567dd38cdd262586fc016f9d927.png
剑指offer:二维数组的查找https://www.zhihu.com/video/1249340729467645952

四、图片描述

7f2d73d42c4b1b767560ee5c2dc8f307.png

a32bd2afb62aedced485a82e840bb0c8.png

8fea049ee00b2e19a0f813a2412b309d.png

ba667dd32cdd4c5a9d2a4fa42535dc00.png

6bd8b031549272d59c5e1a24f2894ab1.png

610dedf60231005d50c9453e684557ec.png

75a48207fe8926314b59dda0a53fde75.png

b72233a93e844f623fc5f7bc4e52ad27.png

4f1f92ebb93048b08301b1af539084c1.png

cd04de60009bb203307e57f7bb31ec39.png

a237701388b720e125c4da500344d994.png

56a0849ac58952daea69d589d6551b4d.png

21277f72595156bb989e910aff38584c.png

3adb3397f1b0533c2b5bd2ed1bda3267.png

136a715a65bddf12b89b888be9ec4277.png

b03f105d3af40e4ba99b2c2c9451fc1b.png

8416a9ccb6932ec3328a1f155c00ec27.png

7c4d4a470eb69b97995da32ff831ce43.png

9f11a376d7fb4e4a737d2176869a17cd.png

五、参考代码

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)。

七、相关标签

  • 数组
  • 双指针
  • 二分法

如果你对学算法感兴趣的话,可以查看简介一起交流学习算法:)

我的专栏:

和程序员小吴一起学算法​zhuanlan.zhihu.com
f76b3739d2a5f85399550b7506306f80.png

我的其它相关回答:

程序员必须掌握哪些算法?​www.zhihu.com
2b22a2857631477c5ac35320a1e946db.png
字节跳动面试难吗,应该如何应对?​www.zhihu.com
a37a2f6985a1cc1282e06b1e8aa52f84.png
大家都是如何刷 LeetCode 的?​www.zhihu.com
0cde64aa819df354c15ff304e0e06022.png
算法网站推荐?​www.zhihu.com
429bde09fd9c76bb64c6a1aabe673843.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值