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




 class Solution:

    def intersection(self, nums, left, right):
        if nums[right] > nums[left]:
            return 0

        while left <= right:
            mid = left + (right-left)//2

            if nums[mid] > nums[mid+1]:
                 return mid + 1
            else:
                if nums[mid] < nums[left]:
                    right = mid - 1
                else:
                    left = mid + 1

    def binary_search(self, nums, target, left, right):

        while left <= right:

            mid = left + (right-left)//2
            if nums[mid] ==  target:
                return mid
            elif nums[mid] > target:
                right = mid - 1
            else:
                left = mid + 1

        return -1       
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums)
        if n == 1:
            return 0 if nums[0] == target else -1

        ins_point = self.intersection(nums, 0, n-1)

        if target == nums[0]:
            return 0

        if ins_point == 0:
            return self.binary_search(nums, target, 0, n-1 )
        elif target > nums[0]:
            return self.binary_search(nums, target, 0, ins_point)
        else:
            return self.binary_search(nums, target, ins_point, n-1)

Random Note


Pythonic Time Complexity Wiki

Important to remember