题目描述
力扣思路
方法一
首先搜索idx在哪个位置旋转的,之后利用二分查找法找出下标得出结果
class Solution:
def search(self, nums: List[int]) -> int:
n = len(nums)
idx = 0
for i in range(n - 1):
if nums[i] > nums[i + 1]:
idx = i
break
ans = self.find(nums, 0, idx, target)
if ans!= -1:
return ans
if idx + 1 < n:
ans = self.find(nums, idx + 1, n - 1, target)
return ans
return -1
def find(self, nums: List[int], l: int, r: int, target: int) -> int:
while l < r:
mid = (l + r) // 2
if nums[mid] >= target:
r = mid
else:
l = mid + 1
return nums[l] if nums[l] == target else -1
第二种方法
class Solution:
def search(self, nums: List[int], target: int) -> int:
if len(nums)<=0:
return -1
left = 0
right = len(nums)-1
while left < right:
mid = (right - left)//2 +left
if nums[mid] == target:
return mid
if nums[mid]>nums[left]:
if nums[left] <=target<=nums[mid]:
right = mid
else:
left = mid+1
else:
if nums[mid+1]<=target<=nums[right]:
left = mid+1
else:
right = mid
return left if nums[left] == target else -1
其中先判断left是否大于right
其次求mid,然后如果mid值==target,直接返回mid
如果mid大于left,再判断target是否在left-mid顺序中,若在则right=mid缩小范围。若不在,则left=mid+1,从左边截取一节。如果mid小于right相反
最后返回left 如果等于的返回target 若不等于直接返回-1
知识积累
//:如a//b为 a整除b后得到的整数商