81. 搜索旋转排序数组 II
Difficulty: 中等
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6]
可能变为 [2,5,6,0,0,1,2]
)。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true
,否则返回 false
。
示例 1:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
示例 2:
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false
进阶:
- 这是 的延伸题目,本题中的
nums
可能包含重复元素。 - 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
Solution
看到题目中出现搜索就要想到二分查找,此题是LeetCode 33. 搜索旋转排序数组 - swordspoet - 博客园的延伸题目,区别在于此题给定的数组有重复的元素,比如对于数组:[1,0,1,1,1]
,nums[left] == nums[mid]
为True,无法像33题那样能判断数组的哪一半是有序的,这种情况需要单独拿出来处理,把left指针向右边移动一位继续二分查找。
class Solution:
def search(self, nums: List[int], target: int) -> bool:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return True
if nums[left] < nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
elif nums[left] > nums[mid]:
if nums[mid] < target <= nums[-1]:
left = mid + 1
else:
right = mid - 1
else:
left += 1
return False