diff --git a/Minimum in Rotated Sorted Array.py b/Minimum in Rotated Sorted Array.py new file mode 100644 index 00000000..316fc8eb --- /dev/null +++ b/Minimum in Rotated Sorted Array.py @@ -0,0 +1,16 @@ +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-low)//2 + if (nums[mid]<=nums[mid-1]) and (nums[mid]<=nums[mid+1]): + return nums[mid] + elif nums[low]<=nums[mid]: + low = mid+1 + else: + high = mid-1 + \ No newline at end of file diff --git a/README.md b/README.md index e96781e0..a064e238 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,45 @@ Example 2: Input: nums = [5,7,7,8,8,10], target = 6 Output: [-1,-1] +class Solution: + + def searchRange(self, nums: List[int], target: int) -> List[int]: + if len(nums)==0: + return [-1,-1] + start = self.start_index(nums,target) + last = self.last_index(nums,target,start) + return [start,last] + + def start_index(self, nums, target): + low = 0 + high = len(nums)-1 + ind = -1 + while low<=high: + mid = low+(high-low)//2 + if nums[mid]==target: + ind = mid + high = mid-1 + elif nums[mid]>=target: + high = mid-1 + elif nums[mid]<=target: + low = mid+1 + return ind + + def last_index(self, nums, target,start): + low = start + high = len(nums)-1 + ind = -1 + while low<=high: + mid = low+(high-low)//2 + if nums[mid]==target: + ind = mid + low = mid+1 + elif nums[mid]>=target: + high = mid-1 + elif nums[mid]<=target: + low = mid+1 + return ind + ## Problem 2: (https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. @@ -37,6 +76,26 @@ Example 2: Input: [4,5,6,7,0,1,2] Output: 0 +Time complexity: O(logn) + +class Solution: + + def findMin(self, nums: List[int]) -> int: + low = 0 + high = len(nums)-1 + if len(nums)==0: + return -1 + while low<=high: + if nums[low] int: + low = 0 + high = len(nums)-1 + if len(nums)==0: + return -1 + while low<=high: + mid = low + (high-low)//2 + if ((mid==0 or nums[mid-1]nums[mid+1])): + return mid + elif (mid!=len(nums)-1 and nums[mid+1]>nums[mid]): + low = mid+1 + else: + high = mid-1 + diff --git a/findPeakElement.py b/findPeakElement.py new file mode 100644 index 00000000..2902e12f --- /dev/null +++ b/findPeakElement.py @@ -0,0 +1,14 @@ +class Solution: + def findPeakElement(self, nums: List[int]) -> int: + low = 0 + high = len(nums)-1 + + while lownums[mid-1]) and (mid==len(nums)-1 or nums[mid]>nums[mid+1]): + return mid + elif (nums[mid]nums[mid]): + return mid + else: + low = mid+1 + elif nums[mid] List[int]: + low = 0 + high = len(nums)-1 + + if len(nums)==0 or targetnums[high]: + return [-1,-1] + + firstIndex = self.SearchFirst(nums, target, low, high) + if firstIndex == -1: + return [-1,-1] + LastIndex = self.SearchLast(nums, target, firstIndex, high) + return [firstIndex,LastIndex] +