代码改变世界

[LeetCode] 81. Search in Rotated Sorted Array II_Medium tag: not real binary search anymore

2019-07-12 10:53  Johnson_强生仔仔  阅读(161)  评论(0编辑  收藏  举报

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.

Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true

Example 2:

Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false

Follow up:

  • This is a follow up problem to Search in Rotated Sorted Array, where numsmay contain duplicates.
  • Would this affect the run-time complexity? How and why?

这个题目跟[LeetCode] 154. Find Minimum in Rotated Sorted Array II_Hard tag: not real binary search anymore类似,因为可以有重复,如果重复数目太多的话,时间复杂度会上升到O(n),所以就直接用O(n) 的方法就好。

Code

class Solution:
    def searchRotate2(self, nums, target):
        return True if target in nums else False

 

Update on 08/01/2023. 看edge case, 1,0,1,1,1,1,1 , 这个情况那就是nums[l] == nums[mid] == nums[r], 就一直r -= 1 and l += 1 直到他们不相等。然后再二分

Code: 

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        l, r = 0, len(nums) - 1
        while l + 1 < r:
            mid = l + (r - l)//2
            num = nums[mid]
            if num == target:
                return True
            # for edge case 3, 1, 2, 3, 3, 3, 3, 3
            # for edge case 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, find the mininal first index, but does not mean that index to n - 1 are not decreasing order. 
            elif nums[l] == num == nums[r]:
                l += 1
                r -= 1
            # first half
            elif nums[l] <= num:
                if nums[l] <= target <= num:
                    r = mid
                else:
                    l = mid
            # second half
            else:
                if num <= target <= nums[r]:
                    l = mid
                else:
                    r = mid
        return True if target in [nums[l],nums[r]] else False