题目
思路分析
题目要求:有序数组旋转后 寻找特定元素的下标(时间复杂度为logn)
- 先找到旋转的位置
- 分开进行2次折半查找
代码展示
class Solution:
def search(self, nums, target):
left = 0
right = len(nums)-1
#寻找出现旋转的地方pos
while left<right:
mid = (left+right)//2
if nums[mid]>nums[right]:
left = mid+1
else:
right = mid
pos = left
#左半部分折半查找
flag1 = self.bsearch(nums[:pos],target)
if flag1!=-1:
return flag1
#如果左半部分找不到,到右半部分找
else:
flag2 = self.bsearch(nums[pos:],target)
if flag2!=-1:
return flag2+pos
else:
return flag2
#折半查找
def bsearch(self,nums,target):
left = 0
right = len(nums)-1
#如果查找失败,返回-1
res = -1
while left<=right:
mid = (left+right)//2
if nums[mid]==target:
return mid
elif nums[mid]<target:
left = mid+1
else:
right = mid-1
return res
if __name__ == "__main__":
a = Solution()
print(a.search([4,5,6,1,2,3],6))