题目

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

示例 1:

img

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

img

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

解答

  • 二分直接求解
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if (m == 0) return false;
        int n = matrix[0].size();

        // 选择合适的行
        int low = 0, high = m - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (matrix[mid][0] == target) return true;
            if (matrix[mid][0] > target) high = mid - 1;
            else if (matrix[mid][n - 1] < target) low = mid + 1;
            else {
                // 执行该行内的二分查找
                int rowLow = 0, rowHigh = n - 1;
                while (rowLow <= rowHigh) {
                    int rowMid = rowLow + (rowHigh - rowLow) / 2;
                    if (matrix[mid][rowMid] == target) return true;
                    if (matrix[mid][rowMid] > target) rowHigh = rowMid - 1;
                    else rowLow = rowMid + 1;
                }
                return false;
            }
        }
        return false;
    }
};