题目:数字在排序数组中出现的次数。输入为一个排序数组和一个数字。
def get_first_num(nums,k,start,end):
if start>end:
return -1
mid = (end+start)//2
if nums[mid]==k:
if mid==0 or (mid>0 and nums[mid-1]!=k):
return mid
else:
end = mid-1
elif nums[mid]>k:
end = mid-1
else:
start = mid+1
return get_first_num(nums,k,start,end)
def get_end_num(nums,k,start,end):
if start>end:
return -1
mid = (end + start) // 2
if nums[mid]==k:
if mid==len(nums)-1 or (mid<len(nums)-1 and nums[mid+1]!=k):
return mid
else:
start = mid
elif nums[mid]>k:
end = mid-1
else:
start = mid+1
return get_end_num(nums,k,start,end)
def get_num_k(nums,k):
start = get_first_num(nums,k,0,len(nums)-1)
end = get_end_num(nums,k,0,len(nums)-1)
print(start,end)
return end-start+1
注:一般解决方式为利用字典统计各个数字出现的次数或者用二分法查找到其中一个目标数字,然后前后再前后查找。这两种方式的时间复杂度都为O(n)。
O(lgn)的方法为使用两次二分查找,第一次查找目标数字第一次出现的位置,第二次查找其最后一次出现的位置,最后两者相减即为目标数的个数。