搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

示例 1:

img

1
2
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

img

1
2
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

两次二分,先找到行,再找到列。注意,不能先确定列再确定行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int l = 0;
int r = m-1;
while(l<r){
int mid =l+r+1>>1;
if(matrix[mid][0]<=target){ //yao'zhao
l=mid;
} else{
r=mid-1;
}
}
int row = l;
l = 0;
r=n-1;
while(l<r){
int mid = l+r+1>>1;
if(matrix[row][mid]<=target){
l=mid;
} else{
r=mid-1;
}
}
return matrix[row][l]==target;
}
}