问题描述:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
问题分析:
参照于一般的在一维矩阵中找寻目标值的算法,最简单的可以通过直接搜索来实现,也可以通过二分法来实现,这道题只需要主意多维矩阵的下标的换算即可。
代码如下:
直接法:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0||matrix[0].size()==0)return false;
int m=matrix.size();
int n=matrix[0].size();
int i=0,j=m*n;
while(i<j){
if(matrix[i/n][i%n]==target){
return true;
}
i++;
}
return false;
}
};
二分法:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0||matrix[0].size()==0)return false;
int m=matrix.size();
int n=matrix[0].size();
int i=0,j=m*n-1;
if(matrix[j/n][j%n]==target)
return true;
int mid=(m*n-1)/2;
int t=-1;
while(i<j&&t<0){
if(matrix[mid/n][mid%n]==target){
return true;
}
else if(matrix[mid/n][mid%n]<target){
if(i==mid){
t=1;
}
i=mid;
mid=(i+j)/2;
}
else{
j=mid;
mid=(i+j)/2;
}
}
return false;
}
};
运行结果
直接法:
二分法: