数字在排序数组中出现的次数

来源:互联网 发布:文明6 中文补丁 mac 编辑:程序博客网 时间:2024/06/03 17:03

1.问题描述

统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3 由于3在这个数组中出现了4次,因此输出4.(来自《剑指offer》)


2.分析

因为数组是排序的,我们可以通过这个性质分别找到第一个k和最后一个k,然后计算出k的个数。找k的时候,以前二分查找的时候 找到了k ,我们还要判断是不是第一个k或最后一个k,如果不是的话还要继续查找。直至找到第一个k和最后一个k。


3.代码


int GetFirstK(int *array,int start,int end,int k ,int length){    if (array == NULL || start > end )    {        return  -1;    }        int middleIndex = (start + end) / 2;        int middleData = array[middleIndex];            if (middleData == k)    {        if ((middleIndex > 0 && array[middleIndex - 1] != k) || middleIndex == 0)        {            return  middleIndex;        }        else        {            end = middleIndex -1;        }    }    else if(middleData > k)    {        end = middleIndex -1;    }    else    {        start = middleIndex + 1;    }        return GetFirstK(array, start, end, k,length);    }int GetLastK(int* array,int start,int end,int k,int length){    if (array == NULL || start > end)    {        return  -1;    }        int middleIndex  = (start + end) / 2;        int middleData = array[middleIndex];        if (middleData == k)    {        if ((middleData == k && array[middleIndex + 1] != k) || middleIndex == length - 1)        {            return  middleIndex;        }        else        {            start = middleIndex + 1;        }            }    else if(middleData > k)    {        end = middleIndex - 1;    }    else    {        start = middleIndex + 1;    }        return  GetLastK(array, start, end, k,length);    }int GetNumberOfKey(int* array,int length,int k){        if (array == NULL || length <= 0)    {        return  0;    }        int start = GetFirstK(array, 0, length - 1, k , length);        int end = GetLastK(array, 0, length - 1, k, length);        int numberOfKey = end - start + 1;        if (start > -1 && end > -1)    {        numberOfKey = end - start + 1;            }        return  numberOfKey;}

0 0