https://leetcode-cn.com/problems/search-rotate-array-lcci/
class Solution(object):
def search(self, arr, target):
"""
:type arr: List[int]
:type target: int
:rtype: int
"""
if arr==[]:
return -1
n=len(arr)
if n==1:
if arr[0]==target:
return 0
else:
return -1
#二分法查找:
left=0
right=n-1
mid=(left+right)//2
ans_index=0
while left<=right:
if arr[mid]==target:
ans_index=mid
break
if arr[left]<arr[right]:#升序数组
if arr[mid]<target:
left=mid+1
else:
right=mid-1
else:#旋转数组(左大于等于右)
if arr[mid]==arr[left] and arr[mid]==arr[right]:#左中右三者相等,顺序查找
for i in range(left+1,right):
if arr[i]==target:
ans_index=i
break
break
elif arr[mid]<arr[left]:
if target>arr[mid] and target<=arr[right]:
left=mid+1
else:
right=mid-1
else:
if target>=arr[left] and target<arr[mid]:
right=mid-1
else:
left=mid+1
mid=(left+right)//2
if arr[ans_index]!=target:
return -1
else:#找到索引值最小的
if arr[0]==arr[ans_index]:
return 0
else:
while ans_index-1>0:
if arr[ans_index-1]!=target:
break
ans_index-=1
return ans_index