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