行、列二分:
class Solution {
public:
bool binsearch(vector<vector<int>>& matrix, int target, int start, bool vertical)
{
int low = start;
int high = vertical ? matrix.size() - 1 : matrix[0].size() - 1 ;
int mid = low + ((high - low)>>2);
while(low <= high)
{
int mid = low + ((high - low)>>2);
if(vertical)
{//列方向二分
if(matrix[mid][start] < target)
{
low = mid + 1;
}
else if(matrix[mid][start] > target)
{
high = mid - 1;
}
else
{
return true;
}
}
else
{//行方向二分
if(matrix[start][mid] < target)
{
low = mid + 1;
}
else if(matrix[start][mid] > target)
{
high = mid - 1;
}
else
{
return true;
}
}
}
return false;
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0)
{
return false;
}
int shortestDim = min(matrix.size(), matrix[0].size());
for(int i = 0; i < shortestDim; i++)
{
if(matrix[i][i] > target)
{//对角线上的是这个子矩阵最小的
return false;
}
bool verticalFound = binsearch(matrix, target, i, true);
bool rowFound = binsearch(matrix, target, i, false);
if(verticalFound || rowFound)
{
return true;
}
}
return false;
}
};
利用矩阵的性质
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/solution/sou-suo-er-wei-ju-zhen-ii-by-leetcode-2/
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int r = matrix.size();
if(r == 0)
{
return false;
}
int c = matrix[0].size();
int i = r - 1, j = 0;
while(i >= 0 && j < c)
{//只要matrix[i][j] != target,i或j总会变
if(matrix[i][j] < target)
{
j++;
}
else if(matrix[i][j] > target)
{
i--;
}
else
{
return true;
}
}
return false;
}
};
参考:
leetcode官方题解
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/solution/sou-suo-er-wei-ju-zhen-ii-by-leetcode-2/