给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
你必须编写一个时间复杂度为 O(log(m * n)) 的解决方案。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
核心思路是二分查找。有两种思路:
1.做两次二分查找,第一次先查在哪一行,第二次查在哪一列;
2.把整个二维矩阵看成逐个递增的元素。mid 是总序号,mid / m 是行号,mid % m 是列号。
第二种思路更简洁一些。
C++14 linesExpandCollapse
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(),n = matrix[0].size();
int l = 0, r = m * n - 1;
while (l <= r) {
int mid = (l + r) / 2;
int row = mid / n, col = mid % n;
if (matrix[row][col] > target) r = mid - 1;
else if (matrix[row][col] < target) l = mid + 1;
else return true;
}
return false;
}