diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..5008ddfc Binary files /dev/null and b/.DS_Store differ diff --git a/find-min-in-rotated.py b/find-min-in-rotated.py new file mode 100644 index 00000000..0a044d87 --- /dev/null +++ b/find-min-in-rotated.py @@ -0,0 +1,13 @@ +class Solution: + def findMin(self, nums: List[int]) -> int: + left = 0 + right = len(nums)-1 + + while left < right: + mid = left + (right - left)//2 + if nums[mid] > nums[right]: + left = mid + 1 + else: + right = mid + + return nums[left] \ No newline at end of file diff --git a/find-peak-element.py b/find-peak-element.py new file mode 100644 index 00000000..d0fe3e68 --- /dev/null +++ b/find-peak-element.py @@ -0,0 +1,17 @@ +class Solution: + def findPeakElement(self, nums: List[int]) -> int: + # -inf [1,2,1,3,5,6,4] -inf + # l m l lr + # -inf [1,2,1,3,5,6,7] -inf, 7 is the peak + # l l m l + left = 0 + right = len(nums)-1 + while left < right: + mid = left + (right - left)//2 + + if nums[mid] < nums[mid+1]: + left = mid + 1 + else: + right = mid + + return left \ No newline at end of file diff --git a/first-and-last.py b/first-and-last.py new file mode 100644 index 00000000..f6687533 --- /dev/null +++ b/first-and-last.py @@ -0,0 +1,50 @@ +class Solution: + # wrong - if you do binary search, then find 1, and expand window -> that is o(n) bc array could be all same number like [8,8,8,8,..] + def searchRange(self, nums: List[int], target: int) -> List[int]: + lower_bound = self.binarySearchLower(nums, target) + if lower_bound == -1: + return [-1, -1] + + upper_bound = self.binarySearchUpper(nums, target) + + return [lower_bound, upper_bound] + + def binarySearchLower(self,nums, target): + left = 0 + right = len(nums)-1 + + while left <= right: + mid = left + (right-left)//2 + if nums[mid]==target: + # we're at lower + if left == mid or nums[mid-1] < target: + return mid + else: + right = mid - 1 + elif nums[mid] < target: + left = mid + 1 + else: + right = mid-1 + + return -1 + + def binarySearchUpper(self,nums, target): + left = 0 + right = len(nums)-1 + +# [5,7,7,8,8,8,10] + #.l l m r + while left <= right: + mid = left + (right-left)//2 + if nums[mid]==target: + # we're at upper bound + if right == mid or nums[mid+1] > target: + return mid + else: + left = mid + 1 + elif nums[mid] < target: + left = mid + 1 + else: + right = mid-1 + + return -1 \ No newline at end of file