LeetCode解题 74:Search a 2D Matrix
Problem 74: Search a 2D Matrix [Medium]
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.
Example 1:
Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
Output: true
Example 2:
Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
Output: false
来源:LeetCode
解题思路
两重二分搜索。先根据每行的末尾数二分搜索确定target所在行,再在该行二分搜索确定是否含有target值。
具体思路:
- biSearch函数用于二分搜索。
- 参数rstart,rend代表搜索的行范围,当rstart = rend时,开始在该行对cstart,cend范围内的列进行二分搜索,找到target返回true,当cstart > cend时表示没有找到,返回false。
整个算法时间复杂度为 O ( log m + log n ) O(\log m + \log n) O(logm+logn)。
运行结果:
Solution (Java)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if(m == 0) return false;
int n = matrix[0].length;
return biSearch(matrix, target, 0, m-1, 0, n-1);
}
private boolean biSearch(int[][] matrix, int target, int rstart, int rend, int cstart, int cend){
int compare;
if(rstart != rend){
compare = matrix[(rstart + rend)/2][cend];
if(target == compare){
return true;
}
else if(target < compare){
return biSearch(matrix, target, rstart, (rstart + rend)/2, cstart, cend);
}
else{
return biSearch(matrix, target, (rstart + rend)/2 + 1, rend, cstart, cend);
}
}
else if(cstart <= cend){
compare = matrix[rstart][(cstart + cend)/2];
if(target == compare){
return true;
}
else if(target < compare){
return biSearch(matrix, target, rstart, rend, cstart, (cstart + cend)/2 - 1);
}
else{
return biSearch(matrix, target, rstart, rend, (cstart + cend)/2 + 1, cend);
}
}
else{
return false;
}
}
}