Suppose an array sorted in ascending order 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.
Your algorithm's runtime complexity must be in the order of O(log n).
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
有序数组中找某个数,二分查找。但是这题中,数组中有序的有两部分,并不确定target会落在那一部分,所以思路是首先判断target会在哪一部分,再二分查找。
class Solution:
def search(self, nums: List[int], target: int) -> int:
start=0
end=len(nums)-1
while start<=end:
mid=(start+end)//2
if nums[mid]==target:
return mid
elif nums[mid]<nums[end]:
if nums[mid]<target and nums[end]>=target:
start=mid+1
else:
end=mid-1
else:
if nums[start]<=target and nums[mid]>target:
end=mid-1
else:
start=mid+1
return -1
mid有两种可能,在前面的有序中或在后面的有序中。首先判断nums[mid]<nums[end],中间小于最右,说明mid在右面较小的序列中,判断target是否在这里,nums[mid]<target<=nums[end],在的话start移到mid+1,不在的话end移到mid-1位置。如果mid不在右面那么就在左边较大的序列中,判断nums[start]<target<nums[mid]。