您的位置:首页 > 其它

统计一个数字在排序数组中出现的次数

2017-10-19 13:46 489 查看
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.

思路:

用二分查找,分别找出第一个3,和最后一个3的位置,然后计算个数。

时间复杂度O(logn)

代码:

[cpp] view
plain copy

#include "stdio.h"  

#include "stdlib.h"  

int GetFirstK(int* data,int length,int k,int start,int end)  

{  

    if(start > end)  

        return -1;  

    int middleIndex=(start+end)/2;  

    int middleData=data[middleIndex];  

    if(middleData == k)  

    {  

        if((middleIndex >0 && data[middleIndex - 1]!=k) || middleIndex ==0)  

            return middleIndex;  

        else  

            end =middleIndex - 1;  

    }  

    else if(middleData > k)  

        end =middleIndex -1;  

    else  

        start=middleIndex+1;  

    return GetFirstK(data,length,k,start,end);  

}  

int GetLastK(int* data,int length,int k,int start,int end)  

{  

    if(start > end)  

        return -1;  

    int middleIndex=(start+end)/2;  

          

    int middleData=data[middleIndex];  

  

    if(middleData == k)  

    {  

        if((middleIndex < length-1  && data[middleIndex + 1] !=k) || middleIndex ==length-1)  

            return middleIndex;  

        else  

            start =middleIndex + 1;  

    }  

    else if(middleData < k)  

        start =middleIndex +1;  

    else  

        end=middleIndex-1;  

    return GetLastK(data,length,k,start,end);  

}  

int GetNumberOfK(int* data,int length,int k)  

{  

    int number=0;  

    if(data !=NULL && length >0)  

    {  

        int first=GetFirstK(data,length,k,0,length-1);  

        printf("f:%d\n",first);  

        int last=GetLastK(data,length,k,0,length-1);  

        printf("l:%d\n",last);  

        if(first > -1 && last > -1)  

            number =last - first +1;  

    }  

    return number;  

}  

void main()  

{  

    int a[8]={1,2,3,3,3,3,4,5};  

    int result=GetNumberOfK(a,8,3);  

    printf("%d",result);  

}  

结果:

f:2

l:5

4Press any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: