---
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'
---

Array

::::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

[Search a 2D Matrix - Leetcode 74 - Python](https://www.youtube.com/watch?v=Ber2pi2C0j0)
