mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
92 lines
2.3 KiB
Plaintext
92 lines
2.3 KiB
Plaintext
---
|
|
title: '74. Search a 2D Matrix'
|
|
description: 'You are given an m x n integer matrix matrix with the following two properties:'
|
|
icon: dot
|
|
topics:
|
|
- { name: "Array", slug: "array" }
|
|
- { name: "Binary Search", slug: "binary-search" }
|
|
- { name: "Matrix", slug: "matrix" }
|
|
video: "Ber2pi2C0j0"
|
|
sidebar:
|
|
label: 'Search a 2D Matrix'
|
|
badge: 'Medium'
|
|
---
|
|
|
|
::::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
|
|
```
|