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, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3, return true.
我的解法:对列应用一次二分查找,对选中的行再一次二分查找。
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int rownum = matrix.size();
int colnum = matrix[0].size();
int len=rownum;
int half,mid,first=0;
while(len>0){
half=len>>1;
mid=first+half;
if(matrix[mid][colnum-1]<target){
first=mid+1;
len=len-half-1;
}
else
len=half;
}//while
if(first==rownum) return false;
return binarySearch(matrix[first], colnum, target);
}
bool binarySearch(vector<int> A, int length, int target){
int left = 0, right = length - 1, mid;
while (left <= right){
mid = (left + right) / 2;
if (A[mid] == target)
return true;
else if (target < A[mid])
right = mid - 1;
else
left = mid + 1;
}
return false;
}
};
讨论区有一解法代码简洁(个人认为效率没有上面的方法高):
“Here is the code that used binary search. The matrix can be viewed as a one-dimensional sorted array. The value of element i in this array in the matrix is matrix[i/cols][i%cols]“
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int rows = matrix.length;
int cols = matrix[0].length;
int s = 0, e = rows* cols - 1;
while(s<=e){
int m = s+(e-s)/2;
if(matrix[m/cols][m%cols]==target)
return true;
else if(matrix[m/cols][m%cols]>target){
e = m -1;
}else{
s = m + 1;
}
}
return false;
}
}