トピック:並べ替えられた配列に数値が表示される回数。入力は、ソートされた配列と数値です。
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
注:一般的な解決策は、辞書を使用して各番号の出現回数をカウントするか、二分法を使用してターゲット番号の1つを見つけてから、前後に検索することです。これら2つの方法の時間計算量はO(n)です。
O(lgn)メソッドは、2つのバイナリ検索を使用します。最初はターゲット番号の最初の出現位置を見つけ、2回目は最後の出現位置を見つけ、2つの最後の減算はターゲット番号の番号。