From 527c2d5bf419dd4db6d972732ba7e41ac34e99a1 Mon Sep 17 00:00:00 2001 From: spencerkrebs Date: Sun, 12 Apr 2026 23:21:19 -0400 Subject: [PATCH] binary 2 --- .DS_Store | Bin 0 -> 6148 bytes find-min-in-rotated.py | 13 +++++++++++ find-peak-element.py | 17 ++++++++++++++ first-and-last.py | 50 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 .DS_Store create mode 100644 find-min-in-rotated.py create mode 100644 find-peak-element.py create mode 100644 first-and-last.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 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