diff --git a/2dmatrix.py b/2dmatrix.py new file mode 100644 index 00000000..77d225d1 --- /dev/null +++ b/2dmatrix.py @@ -0,0 +1,25 @@ +from typing import List + +class Solution: + def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: + rows, cols = len(matrix), len(matrix[0]) + + left, right = 0, rows * cols - 1 + + while left <= right: + mid = (left + right) // 2 + + # Convert 1D index to 2D coordinates + r = mid // cols + c = mid % cols + + val = matrix[r][c] + + if val == target: + return True + elif val < target: + left = mid + 1 + else: + right = mid - 1 + + return False \ No newline at end of file diff --git a/rotated_sorted_array_search.py b/rotated_sorted_array_search.py new file mode 100644 index 00000000..47b49f54 --- /dev/null +++ b/rotated_sorted_array_search.py @@ -0,0 +1,26 @@ +from typing import List +class Solution: + def search(self, nums: List[int], target: int) -> int: + left, right = 0, len(nums) - 1 + + while left <= right: + mid = (left + right) // 2 + + if nums[mid] == target: + return mid + + # Left half is sorted + if nums[left] <= nums[mid]: + if nums[left] <= target < nums[mid]: + right = mid - 1 + else: + left = mid + 1 + + # Right half is sorted + else: + if nums[mid] < target <= nums[right]: + left = mid + 1 + else: + right = mid - 1 + + return -1 \ No newline at end of file diff --git a/search_sorted_array_uknown_size.py b/search_sorted_array_uknown_size.py new file mode 100644 index 00000000..0a287085 --- /dev/null +++ b/search_sorted_array_uknown_size.py @@ -0,0 +1,29 @@ +# """ +# This is ArrayReader's API interface. +# You should not implement it, or speculate about its implementation +# """ +# class ArrayReader: +# def get(self, index: int) -> int: + +class Solution: + def search(self, reader: 'ArrayReader', target: int) -> int: + left, right = 0, 1 + + # Find a range containing target + while reader.get(right) < target: + left = right + right *= 2 + + # Binary Search + while left <= right: + mid = (left + right) // 2 + num = reader.get(mid) + + if num == target: + return mid + elif num < target: + left = mid + 1 + else: + right = mid - 1 + + return -1