classSolution: defsearch(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ deffind_rotate_index(left, right): if nums[left] < nums[right]: return0 while left <= right: pivot = (left + right) // 2 if nums[pivot] > nums[pivot + 1]: return pivot + 1 else: if nums[pivot] < nums[left]: right = pivot - 1 else: left = pivot + 1 defsearch(left, right): """ Binary search """ while left <= right: pivot = (left + right) // 2 if nums[pivot] == target: return pivot else: if target < nums[pivot]: right = pivot - 1 else: left = pivot + 1 return-1 n = len(nums) if n == 0: return-1 if n == 1: return0if nums[0] == target else-1 rotate_index = find_rotate_index(0, n - 1) # if target is the smallest element if nums[rotate_index] == target: return rotate_index # if array is not rotated, search in the entire array if rotate_index == 0: return search(0, n - 1) if target < nums[0]: # search on the right side return search(rotate_index, n - 1) # search on the left side return search(0, rotate_index)