假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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)