leetcode 72 search 2d matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

1
2
3
4
5
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]

Given target = 3, return true.


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
29
class  {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;
int m = matrix.length;
int n = matrix[0].length;

int start = 0;
int end = m-1;
while(start < end){
int mid = start + ((end - start + 1)>>1);
if(matrix[mid][0] <= target) start = mid;
else end = mid-1;
}
int row = start;

start = 0;
end = n-1;
while(start <= end){
int mid = start + ((end - start)>>1);
if(matrix[row][mid] == target){
return true;
}
if(start == end) return false;
else if(matrix[row][mid] < target) start = mid + 1;
else end = mid;
}
return false;
}
}
  • 运用两次二分查找的方法先确定元素所在行数,然后在该行进行查找。
  • 注意返回false的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
class  {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;
int i = 0;
int j = matrix[0].length-1;
while(i < matrix.length && j >= 0){
if(matrix[i][j] == target) return true;
else if(matrix[i][j] < target) i++;
else j--;
}
return false;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class  {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;

int m = matrix.length;
int n = matrix[0].length;

int start = 0;
int end = m * n - 1;

while(start <= end){
int mid = start + ((end - start)>>1);
if(matrix[mid/n][mid%n] == target) return true;
else if(matrix[mid/n][mid%n] < target) start = mid + 1;
else end = mid-1;
}
return false;
}
}
  • 直接将整个二维数组看成是一个一维数组,直接一次二分搜索就好