1. 程式人生 > >《牛客網劍指offer37題》統計一個數字在排序陣列中出現的次數

《牛客網劍指offer37題》統計一個數字在排序陣列中出現的次數

題目:統計一個數字在排序陣列中出現的次數

結果:牛客網程式設計通過

思路及程式:

//中心思想,用二分法找到第一個等於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;
    }