diff --git a/neetcode/arrays/search_2d_matrix/README.md b/neetcode/arrays/search_2d_matrix/README.md new file mode 100644 index 0000000..90c044d --- /dev/null +++ b/neetcode/arrays/search_2d_matrix/README.md @@ -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 diff --git a/neetcode/arrays/search_2d_matrix/solution.py b/neetcode/arrays/search_2d_matrix/solution.py new file mode 100644 index 0000000..8bc7fd5 --- /dev/null +++ b/neetcode/arrays/search_2d_matrix/solution.py @@ -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