题目链接:面试题04. 二维数组中的查找
在一个 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
思路
一开始想着二分查找,没搞通过。看书发现发现书上是从右上角查找。并且题目要注意 二维数组
的各种情况
- 数组引用是否为空
- 是否为{},此时
array.length==0
- 是否为{{}},此时
array.length=1
,array[0].length==0
代码
// Java
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
// 行row
int indexRow = 0;
// 列col
int indexCol = matrix[0].length - 1;
while (indexRow < matrix.length && indexCol >= 0) {
if (matrix[indexRow][indexCol] == target)
return true;
else if (matrix[indexRow][indexCol] > target)
--indexCol;
else
++indexRow;
}
return false;
}
}
其他解法
每行二分查找
// Java
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
return false;
for (int[] row : matrix) {
if (binarySearch(row, 0, row.length, target))
return true;
}
return false;
}
private boolean binarySearch(int[] arr, int left, int right, int target) {
int mid;
while (left < right) {
mid = left + (right - left) / 2;
if (arr[mid] == target)
return true;
else if (arr[mid] < target)
left = mid + 1;
else
right = mid;
}
return false;
}
}
二叉查找树(Binary Search Tree)
书上方法就是把这个方阵从右上角当根节点做此操作。不用递归操作了。
二叉排序树要么是空二叉树,要么具有如下特点
- 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;
- 二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;
- 二叉排序树的左右子树也要求都是二叉排序树;
参考链接:
- http://data.biancheng.net/view/58.html
- https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/comments/
版权属于:moluuser
本文链接:https://archive.moluuser.com/archives/33/
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!
这篇文章不错!
这篇文章不错!
首尾呼应,主题鲜明,收束有力。