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
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3
, return true
.
解题思路:
1、高效排序就不能用两个for循环的暴力解法!
2、注意题目中二维数组的规律分布,如果将其展开可以看作排好序的一维数组,接下来就简单了,使用二分法即可,这时题目就类似于Lintcode14题目,具体见上一篇博文。
class Solution {
public:
/*
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int>> &matrix, int target)
{
// write your code here
if(matrix.empty() || matrix[0].empty()) return false;
int m=matrix.size();//行号
int n=matrix[0].size();//列号
if(target < matrix[0][0] || target > matrix[m-1][n-1]) return false;
//将二维数组转换为一维数组,使用二分法
int lt=0;
int rt=m*n-1;
int mid=(lt+rt)/2;
while(lt<=rt)
{
int row=mid/n;
int col=mid%n;
if(matrix[row][col] == target)
{
return true;
}
else if(matrix[row][col] > target)
{
rt = mid - 1;
}
else
{
lt = mid + 1;
}
mid=(lt+rt)/2;
}
return false;
}
};
JAVA代码:
public class Solution {
/**
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix==null || matrix.length<=0 || matrix[0].length<=0)
return false;
int m = matrix.length; //矩阵的长度
int n = matrix[0].length; //矩阵的宽度
if(target<matrix[0][0] || target>matrix[m-1][n-1])
return false;
for(int i=0 ; i<m ; i++){
if(target <= matrix[i][n-1]){
int temp = Arrays.binarySearch(matrix[i] , target);
if(temp < 0)
return false;
else
return true;
}
}
return false;
}
}