Search a 2D Matrix

Problem

You are given an m x n integer matrix matrix with the following two properties:

  • Each row is sorted in non-decreasing order.
  • The first integer of each row is greater than the last integer of the previous row.

Given an integer target, return true if target is in matrix or false otherwise. You must write a solution in O(log(m * n)) time complexity.

Examples

Example 1:

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

Example 2:

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

Constraints

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

Solution

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        for (const auto &row : matrix) {
            // Rows are now larger then target
            // Immediately return false
            if (target < row.front()) {
                return false;
            }
            // Rows are smaller than target, continue to next ieter
            if (target > row.back()) {
                continue;
            }
            // Target within row range
            // Binary search
            return std::ranges::binary_search(row, target);
        }
        return false;
    }
};