假设以升序排序的数组在事先未知的某个轴上旋转。即[0,1,2,4,5,6,7]
可能成为[4,5,6,7,0,1,2]
)。
将为您提供要搜索的目标值target。如果在数组中找到,则返回其索引,否则返回-1
。
注:假定数组中不存在重复项。算法的运行时复杂度必须为O(log n)。
Input: nums=[4,5,6,7,0,1,2] target: 4
Output: 0
Input: nums=[4,5,6,7,0,1,2] target=3
Output: -1
Method 1 直接返回检索的位置
class Solution:
def search(self, nums: List[int], target: int) -> int:
if target in nums:
return nums.index(target)
else:
return -1
Method 2 二分法
将nums分为左右两部分, 比较target与左右两个位置对应的值的大小,然后逐渐缩小范围。
class Solution:
def search(self, nums: List[int], target: int) -> int:
l=0
r=len(nums)-1
while l<=r:
mid=l+(r-l)//2
if target==nums[mid]:
return mid
if nums[l]<=nums[mid]:
if nums[l]<=target<=nums[mid]:
r=mid-1
else:
l=mid+1
else:
if nums[mid]<=target<=nums[r]:
l=mid+1
else:
r=mid-1
return -1