剑指 Offer 04. 二维数组中的查找

❤️‍来自专栏《LeetCode基础算法题》 欢迎订阅❤️‍

@[TOC]

关于作者

  • 作者介绍

🍓 博客主页:作者主页
🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。
🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

1、题目

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

实例1

现有矩阵 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

2、思路

方法一:暴力解法

  1. 使用暴力解法循环遍历每个数进行判断,如果能够找到就返回 true,否则找不到返回 false
  2. 如果使用暴力法遍历矩阵 matrix ,它的时间复杂度为 O(NM) 。显然不是题目要求我们使用的解法,我们再次观察题目发现,没有使用矩阵 “从上到下递增、从左到右递增” 的这一特点,显然不是最优解法。

方法二:旋转优化

将矩阵旋转45后,类似于树的结构,我们发现对于每个元素,其左分支元素更小、右分支元素更大。所以通过从 “根节点” 开始查找,遇到比 target 大的元素就向左查找,反之则向右查找,直到可找到目标值 target为止。

image-20220313154232281

7这个节点我们称为"根节点",我们发现根节点“左下角“的数字减小,”右下角“的数字增大。

  1. 从矩阵 matrix 根节点元素(索引值为 (i, j) )开始遍历,并与目标值对比:
    • matrix[i][j] > target时,执行 i--
    • matrix[i][j] < target时,执行 j++
    • matrix[i][j] = target 时,返回 true
  2. 行索引或列索引越界时,则代表矩阵中无目标值,返回 false 。

废话少说~上代码!

3、代码

第一次commit AC

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        boolean flag = false;
        for(int i =0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                if(matrix[i][j] == target) flag = true;
            }
        }
        return flag;
    }
}

时间复杂度:O(n<sup>2</sup>)

空间复杂度:O(1)

第二次commit AC

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        boolean flag = false;
        int i = matrix.length - 1;
        int j = 0;
        while(i >= 0 && j < matrix[0].length){
            if(matrix[i][j] < target) j++;
            else if(matrix[i][j] > target) i--;
            else {
               flag = true; 
               return flag;
            }
        }
        return flag;
    }
}

时间复杂度:O(M+N),N 和 M 分别为矩阵行数和列数。
空间复杂度:O(1)

image-20220313155839000

4、总结

认真阅读题目,提取一切有用的信息,加以分析,选择最合适本题目的方法进行解决问题。

原题链接:剑指 Offer 04. 二维数组中的查找