题目描述
这题我自己没想出来
下面贴上一个我觉得比较好理解的答案
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-powcai/
首先我们要读懂题目,虽然我读了很久才读懂是什么意思,这道题就是说有一个升序的数组1234567,现在从中间断开比如从3开始断开,变成(123) (4567),然后这两段数组互换位置(4567) (123),这个例子只是为了方便说明才用1234567,实际上只是一个升序的序列还可以是1 3 5 7 9 11 13,变成9 11 13 1 3 5 7,题目中把这个操作叫做旋转,我们要从这样一个拥有两段升序的序列中找到目标值,而且时间复杂度在O(logN),log(N)其实就提示我们要用二分法了
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:return -1
n = len(nums)
left = 0
right = len(nums) - 1
while left < right:
mid = left + (right - left) //2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
t = left
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) //2
realmid = (mid + t) % n
if nums[realmid] == target:
return realmid
elif nums[realmid] > target:
right = mid - 1
else:
left = mid + 1
return -1
首先大家要分成两部分来看,分界线在
t = left
这句话的前后
这句话之前的代码是在说如何找到那个落差的位置,用1234567的例子4567123就是找到71这个落差的位置,实际上t是1的下标,也就是t是这个序列4567123最小值的下标。大家可以推一下为什么t是1的下标而不是7的下标(因为最后一轮还是left+1了)
找到这个t值,用的是二分查找,时间复杂度是log(N)
这个t值有什么意义呢,我们可以理解成1234567这个序列往→推了t步