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