81. Search in Rotated Sorted Array II (题目链接)
Medium
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
nums
may contain duplicates. - Would this affect the run-time complexity? How and why?
思路:
这个题包含了重复元素,我们在比较的时候,当nums[l] == nums[mid]的时候,我们不能确定到底是左边的序列是有序的,还是右边的序列是有序的,都有可能,所以此时我们将l -= 1,因为去除了一个重复元素,不会影响nums的完整性(这里在减一之前,先判断nums[l]==target, 因为数组中可能是包含一个数,此时mid==l,我们不做比较直接删除的话,不会找到目标元素)。
class Solution:
def search(self, nums: List[int], target: int) -> bool:
if len(nums) == 0:
return False
l, r = 0, len(nums) - 1
while l <= r:
m = (l + r) // 2
if nums[m] > nums[l]:
low, high = l, m
l = m + 1
elif nums[m] < nums[l]:
low, high = m, r
r = m - 1
else:
if nums[l] == target:
return True
l += 1
continue
while low <= high:
mid = (low + high) // 2
if nums[mid] == target:
return True
elif nums[mid] > target:
high = mid - 1
else:
low = mid + 1
return False