这道题目直接遍历一遍也是可以得到答案的。不过如果想快一点的话我们可以用二分查找
前置题目:NC105 二分查找
用二分的方法找到第一个大于等于k的位置(lower_bound)和第一个大于k的位置(upper_bound),然后相减就可以得到答案了。
如下图:lower_bound = 2,upper_bound = 6 所以3出现的次数为6-2=4次。
class Solution: def GetNumberOfK(self, data, k): # write code here return self.upper_bound(k, data)-self.lower_bound(k, data) def lower_bound(self, k, data): left = 0 right = len(data) while left <right: mid = int((left +right)/2) if data[mid]>=k: right = mid else: left = mid+1 return right def upper_bound(self, k, data): left = 0 right = len(data) while left <right: mid = int((left+right)/2) if data[mid] > k: right = mid else: left = mid +1 return right
参考资料: