返回

LeetCode81. 搜索旋转排序数组 II | 刷题打卡

前端

好的,现在就让我们一起踏上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)。

结语

希望这篇文章对您有所帮助!如果您有任何问题,请随时留言。

参考链接