34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:你可以设计并实现时间复杂度为 O ( log n ) O(\log n) O(logn) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
二分法
def findtarget(nums,target):
left,right=0,len(nums)-1
s=[]
while left<=right:
middle=(right-left)//2+left
if nums[middle]<target:
left=middle+1
elif nums[middle]>target:
right = middle - 1
else:
s.append(middle)
if nums[middle-1]==target:
s.append(middle-1)
if nums[middle+1]==target:
s.append(middle+1)
break
if s==[]:
print("[-1,-1]")
else:
print(s)
if __name__=='__main__':
nums=input("nums=").split()
target=str(input("target="))
if nums==[]:
print("[-1,-1]")
else:
findtarget(nums, target)
结果
小结
二分法,找到目标之后,可以在原地左右遍历就行了,不用用二分法整个都去查找核对,那样就跟暴力没什么区别。