74. Search a 2D Matrix

We’re given a 2D matrix and asked to determine if a specific number exists or not. We use binary search in 2 dimensions to accomplish this. Instead of setting the right pointer to the size of one array, we set the right pointer to m * n - 1 where m is the length of the rows and n is the length of the columns.

We calculate the middle selection like always, (r + l) // 2, however, when we index into the 2D matrix, we have to account for it’s 2D nature. Thus, for rows we index into matrix[mid // n] and for columns we index into matrix[mid % n].

With these changes, we conduct our standard binary search and return the result.

The solution is as follows:

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m, n = len(matrix), len(matrix[0])
        l, r = 0, m * n - 1
 
        while l <= r:
            mid = (r + l) // 2
            num = matrix[mid // n][mid % n]
 
            if num == target:
                return True
 
            if num > target:
                r = mid - 1
            else:
                l = mid + 1
 
        return False

_ Time Complexity:

O(log(mn)) - Standard binary search time complexity.

_ Space Complexity:

O(1) - Binary search uses constant space.