题目
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7]
经旋转后可能变为[4,5,6,7,0,1,2]
)。请你在数组中搜索target
,如果数组中存在这个目标值,则返回它的索引,否则返回-1
。
例子
searchRotate([4,5,6,7,0,1,2],4) -> 0
searchRotate([4,5,6,7,0,1,2],3) -> -1
searchRotate([4,5,6,7,0,1,2],1) -> 5
searchRotate([1],0) -> -1
假设
- 输入数组不含重复元素
tips
- 二分查找变形
答案
解法1
def searchRotate(nums,target):
if not nums:
return -1
i,j = 0,len(nums)-1
while i <= j:
m = (i + j) // 2
if target == nums[m]:
return m
if nums[m] < target:
if target >= nums[0] and nums[m] < nums[0]:
j = m - 1
else:
i = m + 1
else:
if target <= nums[len(nums) - 1] and nums[m] > nums[len(nums) - 1]:
i = m + 1
else:
j = m - 1
return -1
性能:
- 时间复杂度
O(logn)
- 空间复杂度
O(1)
关键点:1.二分查找变形