Add solution for neetcode: search_2D_matrix
This commit is contained in:
parent
64108ba422
commit
3bad2db0f1
2 changed files with 82 additions and 0 deletions
27
neetcode/arrays/search_2d_matrix/README.md
Normal file
27
neetcode/arrays/search_2d_matrix/README.md
Normal 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
|
55
neetcode/arrays/search_2d_matrix/solution.py
Normal file
55
neetcode/arrays/search_2d_matrix/solution.py
Normal 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
|
Loading…
Reference in a new issue