假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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 可能包含重复元素。
这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
思路
与33题类似
https://blog.csdn.net/qq_37369124/article/details/87627449
设n=len(nums)
33核心思想为,通过nums[0],nums[n//2],nums[-1],找出前半部分与后半部分中有序的那一个,检测target是否在有序部分中,在的话在有序部分搜索,否则递归的在另一部分搜索。
此题方法与33题类似,但当nums[0]==nums[n//2]==nums[-1]时,无法判断哪一部分有序,可以直接遍历。或者直接掐头去尾,当nums[0]==nums[n//2]==nums[-1]时,循环的去掉开头与结尾的元素,直到能判断哪一部分有序。
代码
def search(self, nums, target):
if len(nums)==0:return False
if len(nums)==1:return nums[0]==target
b=len(nums)-1
n=len(nums)//2
a=0
if nums[a]==target or nums[b]==target or nums[n]==target:return True
while a=nums[a]):
if(nums[n]<=target or targettarget or nums[b]