2021-01-17 Python百日打卡学习自【夸可编程】

'''
搜索旋转数组
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为[4,5,6,7,0,1,2] )。
请你在数组中搜索target ,如果数组中存在这个目标值,则返回它的索引,否则返回-1。

例子
searchRotate([[4,5,6,7,0,1,2]],4) -> 0
searchRotate([[4,5,6,7,0,1,2]],3) -> -1
searchRotate([[4,5,6,7,0,1,2]],1) -> 5
searchRotate([[1]],0) -> -1
假设
输入数组不含重复元素
tips
二分查找变形

'''

def searchRotate(nums, target):
if not nums:
return -1
i, j = 0, len(nums) -1
while i <= j:
m = (i + j)//2
if target == nums[m]:
return m
if nums[m] < target: # 先判断落到左边还是右边, 边界是 m -> j
if nums[m] < nums[0] <= target: # 比较第一个元素?
j = m - 1
else:
i = m + 1
else:
if target <= nums[len(nums) - 1] < nums[m]: # 最后一个元素?
i = m + 1
else:
j = m - 1

return -1
# pass

def searchTarget(nums, target):
if not nums:
return -1
left, right = 0, len(nums) - 1
# 左右指针
while left <= right:
mid = (left + right)//2
if nums[mid] == target:
return mid
# 表示 [left, mid - 1]有序
if nums[0] <= nums[mid]:
if nums[left] <= target < nums[mid]: # target 落在有序空间
right = mid - 1
else: # 搜索[mid+1, right]区间
left = mid + 1
# 表示 [mid+1, right] 有序
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1

print(searchRotate(, s2))

searchRotate([[4,5,6,7,0,1,2]],4)# -> 0

searchRotate([[4,5,6,7,0,1,2]],3)# -> -1

searchRotate([[4,5,6,7,0,1,2]],1)# -> 5

searchRotate([[1]],0) # -> -1

print(searchTarget([4,5,6,7,0,1,2],4))# -> 0
print(searchTarget([4,5,6,7,0,1,2],3))# -> -1
print(searchTarget([4,5,6,7,0,1,2],1))# -> 5
print(searchTarget([1],0) )# -> -1

你可能感兴趣的:(2021-01-17 Python百日打卡学习自【夸可编程】)