返回
LeetCode81. 搜索旋转排序数组 II | 刷题打卡
前端
2023-10-22 06:07:35
好的,现在就让我们一起踏上LeetCode 81 题的解题之旅!
LeetCode 81. 搜索旋转排序数组 II
题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。
若存在返回 true,否则返回 false。
难度:中等。
这是 搜索旋转排序数组 的延伸题目,本题中的数组中可能包含重复元素。
解题思路
这道题与 LeetCode 33 题非常相似,不同之处在于本题中的数组可能包含重复元素。
因此,在使用二分查找时,我们需要考虑以下情况:
- 当
nums[mid]
等于nums[left]
时,我们无法确定target
是在nums[left]
和nums[mid]
之间,还是在nums[mid]
和nums[right]
之间。 - 当
nums[mid]
等于nums[right]
时,我们也无法确定target
是在nums[mid]
和nums[left]
之间,还是在nums[right]
和nums[mid]
之间。
为了解决这个问题,我们可以将数组分成两个部分:
nums[left]
到nums[mid]
nums[mid+1]
到nums[right]
如果 target
在第一个部分,那么我们继续在第一个部分进行二分查找。
如果 target
在第二个部分,那么我们继续在第二个部分进行二分查找。
如果 target
在两个部分都不存在,那么我们返回 false
。
代码实现
def search(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: 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] and nums[mid] == nums[right]:
left += 1
right -= 1
elif nums[left] <= nums[mid]:
if nums[left] <= target <= nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
if nums[mid] <= target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return False
复杂度分析
- 时间复杂度:O(log n),其中 n 是数组的长度。
- 空间复杂度:O(1)。
结语
希望这篇文章对您有所帮助!如果您有任何问题,请随时留言。
参考链接