方法一:先找到p开始下降的点,将数组分为前半部分后半部分:
如果target > nums[0]说明他在前半部分,如果target < nums[0]说明它在后半部分
因此可以缩小范围对于排好序的数组用二分查找找到xiabiao
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) == 0:
return -1
if len(nums) == 1:
if target == nums[0]:
return 0
else:
return -1
i = 0
while i < len(nums) - 1:
if nums[i] < nums[i+1]:
i += 1
else:
break
p = i
if target >= nums[0]:
index = self.binary_search(nums[:p+1],target)
else:
if self.binary_search(nums[p+1:],target) == -1:
index = -1
else:
index = p + 1 + self.binary_search(nums[p+1:],target)
return index
def binary_search(self, nums, target):
left = 0
right = len(nums) - 1
while left <= right :
middle = (left + right) / 2
if nums[middle] == target:
return middle
elif nums[middle] < target:
left = middle + 1
else:
right = middle - 1
return -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 - left) / 2
if nums[mid] == target:
return mid
if nums[mid] > nums[left]:
if nums[left] <= target <= nums[mid]:
right = mid - 1
else:
left = mid + 1
elif nums[mid] < nums[left]:
if nums[mid] <= target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
left += 1
return -1