81:搜索旋转排序数组II

问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

示例

输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

问题分析

这题的难点在于怎么把两个有序数组确定好我们要查找哪个。
最大的难点在于第一个元素有可能跟第二个元素相等导致我们在某些情况下不能有效的得到分界值。
为了处理这个,我们打算抛弃掉与最后一个元素相等的开头,这对结果没有影响。因为最后一个元素值跟打算抛弃掉的值是相等的。
在这里插入图片描述

AC代码

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        if not len(nums):
            return False
        if len(nums) == 1:
            return nums[0] == target
        index = self.findIndex(nums,0,len(nums)-1)
        if index == -1:
            search = nums
        else:
            if target >= nums[0]:
                search = nums[:index]
            else:
                search = nums[index:]
        left = 0
        right = len(search)-1
        while left <= right:
            mid = (left + right) // 2
            if search[mid] == target:
                return True
            elif search[mid] < target:
                left += 1
            else:
                right -= 1
        return False
    def findIndex(self, nums, left, right):
        if nums[left] < nums[right]: # 如果是传统的有序数组,不处理
            return -1
        while left <= right and nums[left] == nums[right]: # 如果不是,则保证它是完全旋转的数组(既是开头不等于结尾)
            left += 1
        if left > right: # 如果数组元素都相等
            return -1
        elif nums[left] < nums[right]: # 如果去掉了某些头部后得到了有序表的头部
            return left
        start = nums[left]
        while left <= right: # 去掉头部冗余后还是两个有序表
            mid = (left+right) // 2
            if mid > 0 and nums[mid-1] > nums[mid]:
                return mid
            elif nums[mid]>= start:
                left = mid + 1
            else:
                right = mid - 1
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103691543
今日推荐