Skip to content

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:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

Example 3:

Input: nums = [1], target = 0
Output: -1

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 ๐Ÿ”’

Video Solution Coming Soon

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

Comments