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
解法
主要思考有序数组的排列,获取 mid值后,可以判断 left -> mid -> right, 两个方向中,必有一个方向是有序的
写法上采用了 [left, right)
的写法,则需要注意获取nums最右侧的值是 nums[right - 1]
而不是 nums[right]
# 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)