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

前置题目:NC105 二分查找
用二分的方法找到第一个大于等于k的位置(lower_bound)和第一个大于k的位置(upper_bound),然后相减就可以得到答案了。
如下图:lower_bound = 2,upper_bound = 6 所以3出现的次数为6-2=4次。

c++

class Solution {
public:
    int lower_bound(vector<int> data,int k)
    {
        int left = 0;
        int right = data.size();
        while(left<right)
        {
            int mid = (left+right)/2;
            if(data[mid] >= k)//后面的都可以不要了
            {
                right = mid; 
            }
            else{//前面的都不要了
                left = mid+1;
            }
        }
        return right;
    }
    int upper_bound(vector<int> data,int k)
    {
        int left = 0;
        int right = data.size();
        while(left<right)
        {
            int mid = (left+right)/2;
            if(data[mid] > k)//后面的都可以不要了
            {
                right = mid;  
            }
            else{//前面的都不要了
                left = mid+1;
            }
        }
        return right;
        return 0;
    }
    int GetNumberOfK(vector<int> data ,int k) {
        return upper_bound(data,k)-lower_bound(data,k);

    }
};

java

public class Solution {
    public int lower_bound(int[] data,int k)
    {
        int left = 0;
        int right = data.length;
        while(left<right)
        {
            int mid = (left+right)/2;
            if(data[mid] >= k)//后面的都可以不要了
            {
                right = mid;
            }
            else{//前面的都不要了
                left = mid+1;
            }
        }
        return right;
    }
    int upper_bound(int[] data,int k)
    {
        int left = 0;
        int right = data.length;
        while(left<right)
        {
            int mid = (left+right)/2;
            if(data[mid] > k)//后面的都可以不要了
            {
                right = mid; 
            }
            else{//前面的都不要了
                left = mid+1;
            }
        }
        return right;

    }
    public int GetNumberOfK(int [] array , int k) {
        return upper_bound(array,k)-lower_bound(array,k);
    }
}

python

class Solution:
    def GetNumberOfK(self, data, k):
        def upper_bound(data,k):
            left = 0
            right = len(data)
            while left<right:
                mid = int((left+right)/2)
                if data[mid] > k:
                    right = midjavascript:void(0);
                else:
                    left = mid+1
            return right
        def lower_bound(data,k):
            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
        return upper_bound(data,k)-lower_bound(data,k);