33. 搜索旋转排序数组
题目描述
整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标上进行了 旋转 旋转后可能的数组示例如下:
思路
旋转后的数组可以分成两部分,两部分内部是有序的,我们可以通过比较 nums[mid] 和 nums[0] 来判断 mid 在哪个部分,然后根据 target 的值来缩小搜索范围
- 时间复杂度:
O(n*log(n)) - 空间复杂度:
O(n)
代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return -1
l,r = 0,len(nums) - 1
while l <= r:
mid = (l+r)//2
if nums[mid] == target:
return mid
if nums[0] <= nums[mid]:
if nums[0] <= target < nums[mid]:
r = mid -1
else:
l = mid + 1
else:
if nums[mid] < target <= nums[-1]:
l = mid + 1
else:
r = mid - 1
return -1