diff --git a/0074_search-a-2d-matrix/README.md b/0074_search-a-2d-matrix/README.md new file mode 100644 index 0000000..c7ae63e --- /dev/null +++ b/0074_search-a-2d-matrix/README.md @@ -0,0 +1,29 @@ +Write an efficient algorithm that searches for a value `target` in an `m x n` integer matrix `matrix`. This matrix has the following properties: + +* Integers in each row are sorted from left to right. +* The first integer of each row is greater than the last integer of the previous row. + +**Example 1:** + +![](https://assets.leetcode.com/uploads/2020/10/05/mat.jpg) + + Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 + Output: true + + +**Example 2:** + +![](https://assets.leetcode.com/uploads/2020/10/05/mat2.jpg) + + 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` +* `-104 <= matrix[i][j], target <= 104` + +https://leetcode.com/problems/search-a-2d-matrix/ \ No newline at end of file diff --git a/0074_search-a-2d-matrix/python3/solution.py b/0074_search-a-2d-matrix/python3/solution.py new file mode 100644 index 0000000..7cf9154 --- /dev/null +++ b/0074_search-a-2d-matrix/python3/solution.py @@ -0,0 +1,42 @@ +class Solution: + def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: + ''' + Two binary searches, first across rows and then + across columns to quickly find the target + ''' + + mid = -1 + start, end = 0, len(matrix) - 1 + + # Figure out which row the number belongs to + while start <= end: + mid = (start + end) // 2 + + if target > matrix[mid][-1]: + start = mid + 1 + elif target < matrix[mid][0]: + end = mid - 1 + else: + break + + # If we never managed to find a row, that means number + # doesn't exist + if not start <= end: + return False + + # The row to search + row = matrix[mid] + start, end = 0, len(row) - 1 + + while start <= end: + mid = (start + end) // 2 + + if target == row[mid]: + return True + elif target > row[mid]: + start = mid + 1 + else: + end = mid - 1 + + return False + \ No newline at end of file