Skip to content

33. Search in Rotated Sorted Array

题目

There is an integer array nums sorted in ascending order (with distinct values).

Prior to being passed to your function, nums is possibly rotated at an unknown pivot index k (1 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be rotated at pivot index 3 and become [4,5,6,7,0,1,2].

Given the array nums after the possible rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

You must write an algorithm with O(log n) runtime complexity.

 

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

Example 3:

Input: nums = [1], target = 0
Output: -1

 

Constraints:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • All values of nums are unique.
  • nums is an ascending array that is possibly rotated.
  • -104 <= target <= 104
Related Topics
  • 数组
  • 二分查找

  • 👍 3194
  • 👎 0
  • 解法

    主要思考有序数组的排列,获取 mid值后,可以判断 left -> mid -> right, 两个方向中,必有一个方向是有序的

    写法上采用了 [left, right) 的写法,则需要注意获取nums最右侧的值是 nums[right - 1] 而不是 nums[right]

    py
    # leetcode submit region begin(Prohibit modification and deletion)
    class Solution:
        def search(self, nums: List[int], target: int) -> int:
            left = 0
            right = len(nums)
    
            while left < right:
                mid = (left + right) // 2
    
                if nums[mid] == target:
                    return mid
    
                # 确定left -> mid是升序的
                if nums[mid] > nums[left]:
                    if nums[mid] > target >= nums[left]:
                        right = mid
                    else:
                        left = mid + 1
                # 确定mid -> right 是升序列的
                else:
                    if nums[mid] < target <= nums[right - 1]:
                        left = mid + 1
                    else:
                        right = mid
    
            return -1
            
    # leetcode submit region end(Prohibit modification and deletion)

    复杂度分析

    • 时间复杂度O(log N)
    • 空间复杂度O(1)