1. 缩小查找范围
1.1 思路
在该二维数组中,每行、列有序,但整体无序,不便于使用二分查找。
我们发现,矩阵的右上角/左下角元素具有明显特征,这里以右上角为例:
- 右上角是当前行的最大值,若目标值大于当前值,可排除该行,即向下查找;
- 右上角是当前列的最小值,若目标值小于当前值,可排除该列,即向左查找。
每次循环,都可以使查找范围缩小一行或一列,最终完成对整个矩阵的搜索。
1.2 复杂度
时间复杂度:O(m+n)
空间复杂度:O(1)
1.3 代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int m = matrix.length;
int n = matrix[0].length;
int i = 0;
int j = n - 1;
while (i < m && j >= 0) {
if (matrix[i][j] == target) {
return true;
} else if (matrix[i][j] > target) {
j--;
} else {
i++;
}
}
return false;
}
}