题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
C++
我的超时。。。
class Solution {
//先按行折半查找,再按列折半查找
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//先按行折半查
int first=0;
int end=matrix.size()-1;
int row;
while(first<end){
row=first+(end-first)/2;
if(matrix[row][0]==target)
return true;
else if(matrix[row][0]<target)
first=row;
else
end=row-1;
}
//找到行了,再二分找列
row=first;
first=0; end=matrix[row].size()-1;
while(first<=end){
int mid=first+(end-first)/2;
if(matrix[row][mid]==target)
return true;
else if(matrix[row][mid]<target)
first=mid+1;
else
end=mid-1;
}
return false;
}
};
优化…
class Solution {
/*
思路:根据矩阵的特点,以矩阵的最右上元素为根,是一棵二叉搜索树
*/
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0)
return false;
int row=matrix.size();
int col=matrix[0].size();
int i=0; int j=col-1;
while(i<row && j>=0){
if(target==matrix[i][j])
return true;
else if(matrix[i][j]>target)
j--;
else if(matrix[i][j]<target)
i++;
}
return false;
}
};