力扣240,搜索二维矩阵(2)
题目描述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
输入输出样例
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false
Tips
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109
解法一:暴力解法
//解法一:暴力解法
bool searchMatrix(vector<vector<int>>&matrix,int target)
{
if(matrix.empty())
{
return false;
}
int rowLength=matrix.size();
int colLength=matrix[0].size();
int row=0,col=0;
//左上角一定是二维矩阵中最小的值
for(int i=0;i<rowLength;i++)
{
for(int j=0;j<colLength;j++)
{
if(matrix[i][j]==target)
{
return true;
}
}
}
return false;
}
解法二,二分查找
bool searchMatrix2(vector<vector<int>>&matrix,int target)
{
if(matrix.empty())
{
return false;
}
int rowLength=matrix.size();
int colLength=matrix[0].size();
//对每一行均进行二分查找
for(int i=0;i<rowLength;i++)
{
if(target<matrix[i][0]||target>matrix[i][colLength-1])
{
continue;
}
int res=binarySearch(matrix[i],target);
if(res)
{
return true;
}
}
return false;
}
bool binarySearch(vector<int>nums,int target)
{
int start=0;
int end=nums.size()-1;
while(start<=end)
{
int mid=(end+start)/2;
if(nums[mid]<target)
{
start=mid+1;
}
else if(nums[mid]>target)
{
end=mid-1;
}
else
{
return true;
}
}
return false;
}
解法三,利用矩阵的右上角元素
//采用类似二叉搜索树的方法,从数组右上角开始,逐次递减
bool searchMatrix3(vector<vector<int>>&matrix,int target)
{
if(matrix.empty())
{
return false;
}
int rowLength=matrix.size();
int colLength=matrix[0].size();
int row=0;
int col=colLength-1;
while(row<rowLength&&colLength>=0)
{
if(target==matrix[row][col])
{
return true;
}
//当target小于当前值,那么当前列可以去除
else if(target<matrix[row][col])
{
col--;
}
else
{
row++;
}
}
return false;
}
};