diff --git a/P1.py b/P1.py new file mode 100644 index 00000000..eb8cad07 --- /dev/null +++ b/P1.py @@ -0,0 +1,19 @@ +# Find peak element in an array +class Solution: + def findPeakElement(self, nums: List[int]) -> int: + low = 0 + high = len(nums)-1 + + while low<=high: + mid = (low+high)//2 + + if (mid==len(nums)-1 or nums[mid] > nums[mid+1]) and (mid ==0 or nums[mid]>nums[mid-1]): + return mid + elif (mid+1 < len(nums) and nums[mid+1]>= nums[mid]): + low = mid+1 + else: + high = mid-1 + return -1 + +# TC: O(logN) +# SC: O(1) \ No newline at end of file diff --git a/P2.py b/P2.py new file mode 100644 index 00000000..8ac5e1e8 --- /dev/null +++ b/P2.py @@ -0,0 +1,24 @@ +# Find minimum in rotated sorted array +class Solution: + def findMin(self, nums: List[int]) -> int: + low = 0 + high = len(nums)-1 + + + while low<=high: + if nums[low] <= nums[high]: + return nums[low] + + mid = (low+high)//2 + + # check for left sorted or right sorted + if mid>0 and nums[mid] < nums[mid-1]: + return nums[mid] + + if nums[mid] >= nums[low]: #left sorted + low = mid+1 + elif nums[mid] < nums[high]: #right sorted + high = mid-1 + + return -1 + diff --git a/P3.py b/P3.py new file mode 100644 index 00000000..8c542a31 --- /dev/null +++ b/P3.py @@ -0,0 +1,59 @@ +# Find First and Last Position of Element in Sorted Array + +class Solution: + def searchRange(self, nums: List[int], target: int) -> List[int]: + + if nums == None or len(nums)==0: + return [-1,-1] + + low = 0 + high = len(nums)-1 + firstElement = -1 + secondElement = -1 + + firstElement = self.findFirstElement(nums, low, high, target) + + if firstElement == -1: + return [-1,-1] + + secondElement = self.findLastElement(nums, firstElement, high, target) + + if secondElement == -1: + return [-1,-1] + + return [firstElement, secondElement] + + + def findFirstElement(self, nums, low, high, target): + while low <= high: + mid = (low+high)//2 + + if nums[mid] == target: + if mid==0 or nums[mid]>nums[mid-1]: + return mid + else: + high = mid-1 + elif nums[mid]>target: + high = mid-1 + else: + low = mid+1 + return -1 + + + def findLastElement(self, nums, low, high, target): + while low <= high: + mid = (low+high)//2 + + if nums[mid] == target: + if mid==len(nums)-1 or nums[mid]target: + high = mid-1 + else: + low = mid+1 + return -1 + +# TC: O(logN) +# SC: O(1) \ No newline at end of file