题目
给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。
示例:
现有矩阵 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。
解题思路
此题与剑指 Offer 04. 二维数组中的查找相同
方法1:暴力解法
- 遍历矩阵,时间复杂度O(m*n)
- 存在matrix[m][n] == target , 返回true
- 否则返回false
方法2:BFS,时间复杂度O(h),h为树的高度
- 如图所示,将矩阵逆时针旋转45度,可以看成是BFS
- 在BFS中查找target
代码
方法1:
// 略
方法2:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
return dfs(matrix, 0, matrix[0].length - 1, target);
}
private boolean dfs(int[][] matrix, int r, int c, int target) {
if (r < 0 || c < 0 || r == matrix.length || c == matrix[0].length) return false;
if (target == matrix[r][c]) return true;
// 如果target小于当前节点,查找左子树;否则查找右子树
return target < matrix[r][c] ? dfs(matrix, r, c - 1, target) : dfs(matrix, r + 1, c, target);
}
}