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