题目在这里
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
class Solution {
public:
int findRow(vector<vector<int>>& matrix, int target){
int st=0;
int end=matrix.size()-1;
int mid=(st+end)/2;//下取整,会等于st
//在区间内成立
while(st<mid){
if(matrix[mid][0]>target){
end=mid-1; //前面判断是否可以-1
}
else{
st=mid;
}
mid=(st+end)/2;
} //限制在两行内了,以上
if(mid+1>=matrix.size()){ //独立元素成立,
return mid;
}
else if(target<matrix[mid+1][0]){//判断前一行后一行
return mid;
}
else{
return mid+1;
}
}
int binarySearch(vector<int>& A,int target){
int st=0,end=A.size()-1;
int mid=(st+end)/2;
while(st<=end){
if(A[mid]==target){
return mid;
}
else if(A[mid]<target){ ///
st=mid+1;
} //这块之前上下写反了
else{
end=mid-1; ///
}
mid=(st+end)/2;
}
return -1;
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(target<matrix[0][0]||matrix[matrix.size()-1][matrix[0].size()-1]<target){
return false;
}
else{
int row=findRow(matrix,target);
return binarySearch(matrix[row],target)==-1?false:true;
}
}
};
思路二:
一次二分查找,看成是个序列,然后计算标号
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
int low = 0, high = m * n - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
int x = matrix[mid / n][mid % n];
if (x < target) {
low = mid + 1;
} else if (x > target) {
high = mid - 1;
} else {
return true;
}
}
return false;
}
};