跳到主要内容

81. 搜索旋转排序数组 II(Medium)

题目描述

一个原本增序的数组被首尾相连后按某个位置断开(如 [1,2,2,3,4,5] → [2,3,4,5,1,2],在第一 位和第二位断开),我们称其为旋转数组。给定一个值,判断这个值是否存在于这个为旋转数组中。

样例

Input: [2,5,6,0,0,1,2], 0
Output: true

Input: [2,5,6,0,0,1,2], 3
Output: false

题解

本题的难点在于,如何应对重复元素,通常 的做法是 left += 1right -= 1搜小范围

Python示例

class Solution:
def search(self, nums: List[int], target: int) -> bool:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] == target:
return True
elif nums[mid] == nums[right]:
right -= 1
elif nums[mid] < nums[right]:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
return False