二维数组中的查找

162 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

题目

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

题目分析

这道题看起来比较简单,这是一个有序的二维数组,如果我们将这个二维数组逆时针旋转45度的话,我们可以看到它和二叉搜索树差不多,我们可以从根节点搜索,比目标元素大的向左进行查找,比目标元素小的向右进行查找。

代码实现

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

思路比较简单,就是我在题目分析中描述的那样,主要用到的思想涉及到二叉搜索树,我这里简单说一下什么是二叉搜索树

二叉搜索树又是二叉查找树,二叉搜索树的性质就是左子树所有结点的值小于根节点,右子树所有结点的值大于根节点的值,二叉搜索树应用很广泛,它方便链表的插入和删除,有能快速查找。

其他思路暴力法也是一种,一次遍历这个二维数组,然后比较,嘿嘿。

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二叉搜索树的操作。

如果有不当之处,欢迎指正。