Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
1. find the pivot
2. do binary search in each part
if it is on the right side the index needs to be right_result + pivot
class Solution(object):
def findPivot(self, nums):
low = 0
high = len(nums) - 1
while low < high and nums[low] > nums[high]:
mid = low + (high - low) / 2
if nums[mid] < nums[high]:
high = mid
else:
low += 1
return low
def binSearch(self, nums, target):
low = 0
high = len(nums) - 1
while True:
if low > high:
return -1
mid = low + (high - low) / 2
if target < nums[mid]:
high = mid - 1
elif target > nums[mid]:
low = mid + 1
else:
return mid
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) == 1 and nums[0] != target:
return -1
elif len(nums) == 1 and nums[0] == target:
return 0
pivot = self.findPivot(nums)
left_result = self.binSearch(nums[:pivot], target)
right_result = self.binSearch(nums[pivot:], target)
if right_result != -1:
right_result += pivot
return max(left_result, right_result)