写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每一列的整数从上到下是排序的。
- 在每一行或每一列中没有重复的整数。
样例
方法二 只需要找到最小一行中第一个比target大的数然后先向左搜索,每次遇见小于target的则保持列不变,行+1,时间复杂度为O(m+n)。
考虑下列矩阵:
[
[1, 3, 5, 7],
[2, 4, 7, 8],
[3, 5, 9, 10]
]
给出target = 3,返回 2
方法一 二分法快速查找:时间复杂度高(没有利用这个矩阵的特点)。
class Solution {
public:
/**
* @param matrix: A list of lists of integers
* @param target: An integer you want to search in matrix
* @return: An integer indicate the total occurrence of target in the given matrix
*/
bool BSearch(vector<vector<int> > matrix,int target,int k,int n){
int first,end,mid;
first=0;
end=n-1;
// cout<<first;
while(first<end){
mid=(first+end)/2;
if(matrix[k][mid]==target)
return true;
else if(matrix[k][mid]<target){
first=mid+1;
}
else
end=mid-1;
}
if(matrix[k][end]==target)
return true;
else
return false;
}
int searchMatrix(vector<vector<int> > &matrix, int target) {
// write your code here
int sum=0;
if(matrix.empty())
return 0;
int m=matrix.size();
int n=matrix[0].size();
int i=0;
while(i<m&&matrix[i][0]<=target){
if(matrix[i][n-1]>=target){
// cout<<n<<endl;
// return m;
if(BSearch(matrix,target,i,n))
sum++;}
i++;
}
return sum;
}
};
方法二 只需要找到最小一行中第一个比target大的数然后先向左搜索,每次遇见小于target的则保持列不变,行+1,时间复杂度为O(m+n)。
class Solution {
public:
/**
* @param matrix: A list of lists of integers
* @param target: An integer you want to search in matrix
* @return: An integer indicate the total occurrence of target in the given matrix
*/
int searchMatrix(vector<vector<int> > &matrix, int target) {
// write your code here
int sum=0;
if(matrix.empty())
return 0;
int m=matrix.size();
int n=matrix[0].size();
int i=0,j=n-1;
for(;i<m;i++){
if(matrix[i][0]<=target&&matrix[i][n-1]>=target)
break;
}
for(;j>=0;j--){
if(i>=m)
break;
if(matrix[i][j]<=target)
break;
}
while(i<m&&j>=0){
if(matrix[i][j]==target)
{
sum++;
j--;
i++;
}
else if(matrix[i][j]>target)
j--;
else if(matrix[i][j]<target)
i++;
}
return sum;
}
};