74. 搜索二维矩阵
问题
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
分析
先找哪一行,再找哪一列。两次二分即可。同样,开区间二分好写好理解。
代码
class Solution {
public:
vector<vector<int>> g;
int target;
int n = 0, m = 0;
bool res = false;
void bi_search() {
int l = -1, r = n;
while(l+1 < r) {
int mid = (l+r) >> 1;
if (g[mid][0] > target) {
r = mid;
} else {
l = mid;
}
}
if (l < 0 || l >= n) {res = false; return ;}
int l_row = -1, r_row = m;
while(l_row+1 < r_row) {
int mid = (l_row + r_row) >> 1;
if (g[l][mid] >= target) {
r_row = mid;
} else {
l_row = mid;
}
}
// 由于是开区间,这里要加r_row < m,防止本来右指针就没动。这里判断谁就限制谁,如果用到l_row就限制l_row >-1
if (r_row<m && g[l][r_row] == target) {
res = true;
} else {
res = false;
}
return ;
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
this->g = matrix;
this->target = target;
n = matrix.size();
m = matrix[0].size();
bi_search();
return res;
}
};

浙公网安备 33010602011771号