劍指offer之統計一個數字在排序數組中出現的次數。

1.題目描述

統計一個數字在排序數組中出現的次數。

2.問題分析

方法一:

因爲是排序的數組,首先在數組中找到第一個值爲k的位置begin,之後從begin找下一個不等於值k的位置end,則,次數爲end - begin。
例如:1 2 2 3 3 3 5,k = 3,則begin = 3,end = 6,則次數是 end - begin = 3.

方法二:

因爲是排序的數組,通過二分查找法查找到數組中一個值爲k的座標,之後從該位置,分別向左,右移動第一個不爲k值的位置。
例如:1 2 2 3 3 3 5,k = 3,假設找到的下標是4,則使用一個begin = index,end = index,begin向左移動,直到所指的值不爲3,即:begin = 2; 同理,end向右移動,直到所指的值不爲3,即end = 6,那麼次數是: end - begin -1 = 3.

3.源代碼

方法一:

int GetNumberOfK(vector<int> data ,int k)
{
    int size = data.size();
    if(size == 0)
        return 0;
        
        int begin = 0;
        while(begin < size && data[begin] != k) ++begin;
        int end = begin;
        while(end < size && data[end] == k) ++end;
        return end - begin;
}

方法二:

int findIndexOfK(vector<int>& data, int k,int begin, int end)
{
    if(begin > end)
        return -1;
    int mid = (end - begin) / 2 + begin;
    if(k == data[mid])
        return mid;
    else if(k > data[mid])
        return findIndexOfK(data,k,mid + 1,end);
    else
        return findIndexOfK(data,k,begin,mid - 1);
}
int GetNumberOfK(vector<int> data ,int k)
{
    int size = data.size();
    if(size == 0)
        return 0;

    int index = findIndexOfK(data, k, 0, size - 1);
    if(index == -1)
        return 0;
    int begin = index,end = index;
    while(begin >= 0 && data[begin] == data[index]) --begin;
    while(end <= size - 1 && data[end] == data[index]) ++end;
    return end - begin - 1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章