布鲁斯的技术小屋

搜索二维矩阵II

LC 240 搜索二维矩阵 II

有一个 m * n的矩阵,其中该矩阵每行从左到右升序,每列从上到下升序

给定一个target值,找到返回true,反之返回false

暴力

时间复杂度O(MN),显然不好

二分查找

第一时间想到的,时间复杂度O(MlogN),但显然还有优化的地方,因为都只用到了一维的有序,要么行有序,要么列有序,显然条件浪费了

代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = matrix.size(), col = matrix[0].size();
for(int i = 0; i < row; i++) {
int l = 0, r = col - 1;
while(l <= r) {
int mid = (l + r) / 2;
if(target == matrix[i][mid])
return true;

if(target > matrix[i][mid])
l = mid + 1;
if(target < matrix[i][mid])
r = mid - 1;
}
}
return false;
}

分治

(不看题解我真的想不到系列。。。)

把矩阵的右上角设为一个端点。这么设定的原因是因为在右上角,这时候搜索的方向要么往下,要么往左,往下是升序,往左是降序,这样子会通过阶梯式的办法找到target数

如图所示,从右上角的15开始,查找目标数5

61764d91e598f

代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = matrix.size(), col = matrix[0].size();
int x = 0, y = col - 1;
while(x < row && y >= 0) {
if(target == matrix[x][y])
return true;

if(target < matrix[x][y])
y--;
else if(target > matrix[x][y])
x++;
}
return false;
}