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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容