题目描述


描述:

给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数

示例1 输入: [1,2,3,3,3,3,4,5],3
返回值: 4


题解1:暴力法,遍历数组中所有的元素

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
//         题解1:暴力法
        int count = 0;
        for(int i = 0;i<data.size();i++){
            if(data[i] == k){
                count++;
            }
        }
        return count;  
    }
};

题解2:通过二分法找到元素k在数组中下标最小的位置和小标最大的位置处

图示如下,图为某位大佬的图示,在此借鉴: alt

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        //题解2:通过二分法分别找到元素k在数组中的下标最小处位置和下标最大处的位置
        int lowBound = 0;//下界限
        int largeBound = 0;//上界限
        int left = 0;
        int right =data.size()-1;
        //找到元素k在数组中下标最小处的位置
        while(left <= right){
            int mid = (left + right)/2;
            if(data[mid] > k)
                right = mid-1;
            else if(data[mid] <k )
                left = mid+1;
            else{//找到了元素k所在的位置
                lowBound = largeBound = mid;
                while(data[lowBound] == k)
                    lowBound--;//当元素k重复时,下标界-1
                while(data[largeBound] == k)
                    largeBound++;//当元素k重复时,上标界-1
                return largeBound - lowBound -1;//边界相减,得到重复元素个数
            }
        }
        return 0;
        
    }
};