题目来源:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
大致题意:
从给定的二维矩阵中找到目标值。二维矩阵满足两个条件:
- 同一行的元素升序
- 同一列的元素升序
思路
- 对所有行调用二分查找,查找目标值,时间复杂度O(m logn)
- 想不出来名字
第二个方法是根据矩阵的属性,因为所有行列都是升序的,二分只用到了行内的升序,如果利用到列的升序,可以使时间复杂度降到 O(m + n)
可知,对于某个位置的元素来说,比它小的元素一定在左侧或者上侧,比它大的元素一定在右侧或者下侧。而直接遍历查找的话,时间复杂度为 O(mn)。
而我们可以去掉两个方向的查询,使比当前位置小的元素一定在上侧,比它大的元素一定在右侧。
- 从左下角开始进行查询,此时左侧和下侧没有元素,所以一定是查上侧和右侧
- 对于当前元素,如果其大于target,那么目标位置一定在上侧;如果其小于 target,那么目标一定在右侧;如果等于,直接返回。
- 如果是当前位置不等于 target,按照上一条的判断向相应位置移动,然后重复 2、3
代码:
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int col = 0;
int row = m - 1;
while (col < n && row >= 0) {
if (matrix[row][col] == target) { // 等于,直接返回
return true;
} else if (matrix[row][col] < target) { // 小于target,往右侧查
col++;
} else { // 大于 target,往上侧查
row--;
}
}
return false;
}