给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

你必须编写一个时间复杂度为 O(log(m * n)) 的解决方案。

示例 1:

image 输入: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;
}