python算法日记(二分法)_leetcode 81. 搜索旋转排序数组 II

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

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

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

示例 1:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii

这道题是33题的延伸,33题题解https://blog.csdn.net/weixin_39331401/article/details/104877322

这个题直接用33题的方法会有两个样例不能过:如nums = [1, 3, 1, 1, 1], target = 3。此时nums[mid]==nums[left],用33题的代码会把左边1,3,1误判为顺序。分不清到底是左边有序还是右边有序,此时 left+=1 即可。相当于去掉一个重复的干扰项。

评论说有一个弊端:如果是[1,1,1,1,1,1,1,1,1,1,1,3,1]这种情况的话,最坏复杂度是否是O(n),跟直接遍历差不多

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        if not nums:
            return False
        lens = len(nums)
        left,right = 0,lens-1
        while left<right:
            mid = (left+right)>>1
            if nums[mid]==target:
                return True
            elif nums[left]==nums[mid]:
                left +=1
            elif nums[left]<nums[mid]:
                if nums[left]<=target and target<=nums[mid]:
                    right = mid-1
                else:
                    left = mid+1
            else:
                if nums[mid]<=target and target<=nums[right]:
                    left = mid+1
                else:
                    right = mid-1
        if nums[left]==target:
            return True
        else:
            return False

参考题解来源:作者:reedfan
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/solution/zai-javazhong-ji-bai-liao-100de-yong-hu-by-reedfan/ 来源:力扣(LeetCode)

发布了43 篇原创文章 · 获赞 0 · 访问量 1875

猜你喜欢

转载自blog.csdn.net/weixin_39331401/article/details/104878860