题目描述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
现有矩阵 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
。
解题思路
设置起始点为右上角的元素,总体的遍历方向是向左下,每次遍历,将target
和当前元素matrix[row][col]
进行比较。
- 如果
target
大于当前元素,则说明target
的坐标肯定在当前元素的下面,而不可能在左边 - 如果
target
小于当前元素,则说明target
的坐标肯定在当前元素的左边,而不可能在下面 - 遍历完整个二维数组都没有找到匹配的
target
,则返回false
Java 实现
public boolean searchMatrix (int[][] matrix, int target) {
if (matrix == null || matrix.length < 1 || matrix[0].length < 1) {
return false;
}
int row = 0;
int col = matrix[0].length - 1;
while (row <= matrix.length - 1 && col >= 0) {
if (target == matrix[row][col]) {
return true;
} else if (target > matrix[row][col]) {
row++;
} else if (target < matrix[row][col]) {
col--;
}
}
return false;
}
心得体会
最开始想利用左上到右下的对角线进行二分查找,思路局限于二分查找,但实际上用线性时间实现起来更简便。