33. Search in Rotated Sorted Array
Medium
Description
There is an integer array nums
sorted in ascending order (with distinct values).
Prior to being passed to your function, nums
is possibly rotated at an unknown pivot index k
(1 <= k < nums.length
) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]
] (0-indexed). For example, [0,1,2,4,5,6,7]
might be rotated at pivot index 3
and become [4,5,6,7,0,1,2]
.
Given the array nums
after the possible rotation and an integer target
, return the index of target
if it is in nums
, or -1
if it is not in nums
.
You must write an algorithm with O(log n)
runtime complexity.
Example 1:
Example 2:
Example 3:
Constraints:
1 <= nums.length <= 5000
-104 <= nums[i] <= 104
All values of nums are unique.
nums is an ascending array that is possibly rotated.
-104 <= target <= 104
Solutions ๐
Approach: Binary Search
Time complexity: \(O(\log n)\)
Space complexity: \(O(1)\)
Algorithm Template
Binary Search - Template
def fn(arr, target):
left = 0
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target: # found the target
# do something
return
if arr[mid] > target:
#update right pointer because target lies in left half
right = mid - 1
else:
#update left pointer because target lies in right half
left = mid + 1
# left is the insertion point
return left
Tip
Learn this , this is the Binary Search in a Rotated array containing duplicates and write this in interviews
class Solution:
def search(self, nums: List[int], target: int) -> int:
n=len(nums)
l, r = 0, n-1
while l<=r:
mid=(l+r)//2
if nums[mid] ==target: #pitfall see nums[mid]==target not mid ==target , mid is the index value
return mid
#condition to check for duplicates , you can remove this `if` condition if you want then change below `elif` to `if`
if nums[l] == nums[mid] == nums[r]: #to skip the same elements/or identical values/duplicates
l += 1
r -= 1
elif nums[mid]>=nums[l]: # left half array nums[l..m] are sorted
if nums[l]<=target<nums[mid]:
r=mid-1
else:
l=mid+1
else: #nums[l]>nums[mid] #right half array nums[m..n - 1] are sorted
if nums[mid]<target<=nums[r]:
l=mid+1
else:
r=mid-1
return -1