--- title: '74. Search a 2D Matrix' description: 'You are given an m x n integer matrix matrix with the following two properties:' sidebar: label: 'Search a 2D Matrix' badge: 'Medium' --- Binary Search ::::warning You must write a solution in O(log(m * n)) time complexity. :::: ### 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` - `-10^4 <= matrix[i][j], target <= 10^4` ## Approach ```mermaid flowchart TD S(["searchMatrix(matrix, target)"]) --> I["top = 0, bot = ROWS - 1"] I --> W1{"top <= bot?"} W1 -- yes --> R1["row = (top + bot) // 2"] R1 --> C1{"target vs that row's range"} C1 -- "above matrix[row][-1]" --> U["top = row + 1"] C1 -- "below matrix[row][0]" --> V["bot = row - 1"] C1 -- inside --> B(["break — row found"]) U --> W1 V --> W1 W1 -- no --> F(["return False — no row can hold it"]) B --> P["row = (top + bot) // 2; l = 0, r = COLS - 1"] P --> W2{"l <= r?"} W2 -- no --> G(["return False"]) W2 -- yes --> M["m = (l + r) // 2"] M --> C2{"target vs matrix[row][m]"} C2 -- greater --> X["l = m + 1"] C2 -- smaller --> Y["r = m - 1"] C2 -- equal --> T(["return True"]) X --> W2 Y --> W2 ``` ## Solution ```py class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: ROWS, COLS = len(matrix), len(matrix[0]) top, bot = 0, ROWS - 1 while top <= bot: row = (top + bot) // 2 if target > matrix[row][-1]: top = row + 1 elif target < matrix[row][0]: bot = row - 1 else: break if not (top <= bot): return False row = (top + bot) // 2 l, r = 0, COLS - 1 while l <= r: m = (l + r) // 2 if target > matrix[row][m]: l = m + 1 elif target < matrix[row][m]: r = m - 1 else: return True return False ``` ## Explanation