题目:
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
代码:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 二分查找法
left = 0 #查找的下标
right = len(nums) -1 #查找的上标
while left <= right :
mid = (left + right)/2
if nums[mid] == target :
return mid
if nums[left] <= nums[mid] : #确定有顺序的部分:如果nums[left]<nums[mid],则left到mid的部分数据有序(如果nums[left]=nums[mid],说明左边这段只有一个元素,要考虑到这个特殊情况);如果nums[mid]<nums[right],则是mid到right这部分数据是有序的。确定了有序的序列后,再判断要查找的数在不在有序序列里,并相应跟新查找的上下标left和right
if nums[left] <= target <= nums[mid] :
right = mid -1
else :
left = mid +1
else : #否则,mid到right部分的数据有序
if nums[mid] <= target <= nums[right] :
left = mid + 1
else :
right = mid -1
return -1
关键是确定有序的部分,通过左右两端的数据与中间数据比较,如果left的数据比mid的小,则left到mid是有序的;如果mid的数据比right的小,则mid到right的部分数据是有序的