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

你可能感兴趣的:(剑指offer)