class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
***最终一定是在连续区间找到
思路就是二分查找,left right 以及中点mid
nums[left]>nums[right]不连续
nums[left]<nums[right]连续→二分查找
先写个二分查找
"""
def BinSearch(i,j):
if i==j-1:
return -1
else:
if nums[(i+j+1)/2]==target:
return (i+j+1)/2
elif nums[(i+j+1)/2]>target:
return BinSearch(i,(i+j+1)/2)
else:
return BinSearch((i+j+1)/2,j)
def SolutionResearch(left=0,right=len(nums)-1):
'''
:param left:左指针
:param right:右指针
:return:
二分;如果落在连续区间进BinSearch,如果落在不连续区间继续执行
'''
middle=(left+right+1)/2
if left==right-1:
return -1
else:
if nums[middle]==target:
return middle
elif nums[middle]>nums[right]:#前连后不连
if nums[left]<target and target<nums[middle]:#在前
return BinSearch(left,middle)
else:#在后
return SolutionResearch(middle,right)
else:#后连前不连
if nums[middle]<target and target<nums[right]:#在后
return BinSearch(middle,right)
else:
return SolutionResearch(left,middle)
if nums[-1]==target:#检查不到索引-1
return len(nums)-1
elif nums[0]==target:
return 0
elif len(nums)==1:
return -1
else:
return SolutionResearch()
思路就是用二分查找,不过取中值的时候要判断target是落在断的部分还是连的部分,如果在断的部分继续调用本函数,如果在连的部分就直接进入二分查找