这道题目直接遍历一遍也是可以得到答案的。不过如果想快一点的话我们可以用二分查找

前置题目: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

参考资料: