1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row = 0;
while (row < matrix.length && target > matrix[row][matrix[0].length - 1]) {
row += 1;
}
if (row == matrix.length)
return false;
int left = 0, right = matrix[row].length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (matrix[row][mid] == target) {
return true;
} else if (matrix[row][mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
}

找到target可能出现在哪一行, 然后binary search.

时间复杂度: O(m + logn)
空间复杂度: O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) {
return false;
}
int start = 0, rows = matrix.length, cols = matrix[0].length;
int end = rows * cols - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (matrix[mid / cols][mid % cols] == target) {
return true;
}
if (matrix[mid / cols][mid % cols] < target) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return false;
}
}

把这个2D matrix当作是一维的, 直接binary search, 把mid转化成row和col的方式很妙.

时间复杂度: O(log(m * n))
空间复杂度: O(1)

我的那个方法不用一行行看而是也用一个binary search, 找到那个比target大的每行结尾的数字中最小的那个.
那么这一行就是target可能出现的位置.