编写一个高效的算法来搜索 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。
给定 target = 20,返回 false。
类似题目: LeetCode 74. 搜索二维矩阵(二分查找) 程序员面试金典 - 面试题 10.09. 排序矩阵查找
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
L
形状是有序的,根据大小选择走的方向class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
if(matrix.size()==0 || matrix[0].size() == 0)
return false;
int r = matrix.size(), c = matrix[0].size();
int x = r-1, y = 0;//左下角
while(x>=0 && y<c)
{
if(matrix[x][y] == target)
return true;
else if(matrix[x][y] < target)
y++;
else
x--;
}
return false;
}
};
or
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
if(matrix.size()==0 || matrix[0].size() == 0)
return false;
int r = matrix.size(), c = matrix[0].size();
int x = 0, y = c-1;//右上角
while(x<r && y>=0)
{
if(matrix[x][y] == target)
return true;
else if(matrix[x][y] < target)
x++;
else
y--;
}
return false;
}
};
class Solution {
int m,n;
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0 || matrix[0].size() == 0)
return false;
int r = matrix.size(), c = matrix[0].size();
m = r, n = c;
int x1 = 0, y1 = 0, x2 = r-1, y2 = c-1, mx, my;
bool ans = false;
return search(matrix,target,x1,y1,x2,y2,ans);
}
bool search(vector<vector<int>> &matrix, int &target, int x1, int y1, int x2, int y2, bool &ans)
{
if(ans)
return true;
if(x1 > x2 || y1 > y2 ||x1<0||x1>=m||x2<0||x2>=m||y1<0||y1>=n||y2<0||y2>=n)
return false;
int mx = x1+((x2-x1)>>1);
int my = y1+((y2-y1)>>1);
if(matrix[mx][my] == target)
{
ans = true;
return ans;
}
if(matrix[mx][my] < target)
{
search(matrix,target,x1,my+1,mx,y2,ans)
|| search(matrix,target,mx+1,y1,x2,my,ans)
|| search(matrix,target,mx+1,my+1,x2,y2,ans);
return ans;
}
else
{
search(matrix,target,x1,my,mx-1,y2,ans)
|| search(matrix,target,mx,y1,x2,my-1,ans)
|| search(matrix,target,x1,y1,mx-1,my-1,ans);
return ans;
}
}
};