Leetcode练习(Python):数组类:第81题:假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

题目:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。  ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。  编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

思路:

节省空间使用二分法。

程序:

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        length = len(nums)
        if length <= 1:
            if target in nums:
                return True
            else:
                return False
        head = 0
        tail = length - 1
        while head <= tail:
            middle = (head + tail) // 2
            if nums[middle] == target:
                return True
            if nums[head] == nums[middle] and nums[middle] == nums[tail]:
                head += 1
                tail -= 1
            elif nums[head] > nums[middle]:
                if target > nums[middle] and target <= nums[tail]:
                    head = middle + 1
                else:
                    tail = middle - 1
            else: #nums[head] <= nums[middle]:
                if target >= nums[head] and target < nums[middle]:
                    tail = middle - 1
                else:
                    head = middle + 1
        return False