1. 程式人生 > >劍指offer之統計一個數字在排序陣列中出現的次數。

劍指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; }