Add solution for neetcode: search_2D_matrix

This commit is contained in:
pro100ton 2025-02-22 13:36:53 +03:00
parent 64108ba422
commit 3bad2db0f1
2 changed files with 82 additions and 0 deletions

View file

@ -0,0 +1,27 @@
Search a 2D Matrix
You are given an m x n 2-D integer array matrix and an integer target.
Each row in matrix is sorted in non-decreasing order.
The first integer of every row is greater than the last integer of the previous row.
Return true if target exists within matrix or false otherwise.
Can you write a solution that runs in O(log(m * n)) time?
Example 1:
Input: matrix = [[1,2,4,8],[10,11,12,13],[14,20,30,40]], target = 10
Output: true
Example 2:
Input: matrix = [[1,2,4,8],[10,11,12,13],[14,20,30,40]], target = 15
Output: false
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10000 <= matrix[i][j], target <= 10000

View file

@ -0,0 +1,55 @@
from typing import List
import pytest
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
matrix_length = len(matrix)
right = len(matrix) - 1
left = 0
middle = matrix_length // 2
while left <= right:
middle_row_left = matrix[middle][0]
middle_row_right = matrix[middle][-1]
# Check if target is in current middle row
if target >= middle_row_left and target <= middle_row_right:
bingo_matrix = matrix[middle]
bingo_matrix_left = 0
bingo_matrix_right = len(bingo_matrix) - 1
bingo_matrix_middle = (bingo_matrix_left + bingo_matrix_right) // 2
print(bingo_matrix)
while bingo_matrix_left <= bingo_matrix_right:
print(f"Middle: {bingo_matrix[bingo_matrix_middle]}")
if target < bingo_matrix[bingo_matrix_middle]:
bingo_matrix_right = bingo_matrix_middle - 1
bingo_matrix_middle = (
bingo_matrix_left + bingo_matrix_right
) // 2
elif target > bingo_matrix[bingo_matrix_middle]:
bingo_matrix_left = bingo_matrix_middle + 1
bingo_matrix_middle = (
bingo_matrix_left + bingo_matrix_right
) // 2
else:
print("Target: {target}")
return True
return False
if target < middle_row_left:
right = middle - 1
middle = (left + right) // 2
else:
left = middle + 1
middle = (left + right) // 2
return False
@pytest.mark.parametrize(
"input_value,target, expected_value",
[
([[1, 2, 4, 8], [10, 11, 12, 13], [14, 20, 30, 40]], 10, True),
([[1, 2, 4, 8], [10, 11, 12, 13], [14, 20, 30, 40]], 15, False),
],
)
def test_solution(input_value, target, expected_value):
s = Solution()
assert s.searchMatrix(matrix=input_value, target=target) == expected_value