81. 搜索旋转排序数组 II

https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/

解法一:二分

注意与 33. 搜索旋转排序数组 的不同在于有重复。

与33题解法的区别在于排除重复元素的干扰 注意判断左右分支的方式有两种,左分支可以与n-1号元素相比,也可以与right比,但都必须用大于,因为有重复

class Solution:
    def search(self, nums, target: int) -> bool:
        n = len(nums)
        left, right = 0, n-1
        while left <= right:
            if nums[left] == target or nums[right] == target:
                return True
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return True
            # mid在左分支(当[left,right]中间有断点)
            # 或者[left,right]已经无断点,但[left,mid]是肯定无断点
            if nums[mid] > nums[n-1]:   # if nums[mid] > nums[right]:
                if nums[left] < target and target < nums[mid]:
                    right = mid - 1
                else:
                    left = mid + 1
            # mid在右分支,分析同上
            elif nums[mid] < nums[0]:   # elif nums[mid] < nums[left]:
                if nums[mid] < target and target < nums[right]:
                    left = mid + 1
                else:
                    right = mid - 1
            else:   #无法确定在哪个分支
                left += 1
                right -= 1
        return False

最后更新于