《牛客网剑指offer37题》统计一个数字在排序数组中出现的次数

来源:互联网 发布:全球进出口数据 编辑:程序博客网 时间:2024/06/11 17:22

题目:统计一个数字在排序数组中出现的次数

结果:牛客网编程通过

思路及程序:


//中心思想,用二分法找到第一个等于K的数组元素,然后向两边移动,直到找到不等于k的元素
    int GetNumberOfK(vector<int> data ,int k) {
        int len = data.size();
        if(len == 0) return 0; //数组长度是0,返回0
        if(len == 1) return (data[0]==k)?1:0;  //数组长度是1,如果这个元素等于k返回1,否则返回0
        int i=0,j=len-1; //二分法是从0到len-1
        int result = 0;
        while(i<j){
            int n = (i+j)/2; 
            if(data[n] == k){
                int temp = n;
                while(temp>=0){  //找到了先向左移动找等于k的元素个数
                    if(data[temp] == k)
                        result++;
                    else
                        break;
                    --temp;
                }
                temp = n;
                while(temp<len){  //再向右移动等于k的元素个数
                    if(data[temp] == k)
                        result++;
                    else
                        break;
                    ++temp;
                }
                return --result;  //第一次找到的重复了,要减去1
            }
            else if(data[n] > k){
                j = n-1;  //如果k是比中间元素小,将后面的指针j指向中间前一个
            }
            else{
                i = n+1;  //如果k比中间元素大,将后面指针指向中间元素后一个
            }
        }
        return result;
    }

0 0