[九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数

来源:互联网 发布:淘宝页面设计教程 编辑:程序博客网 时间:2024/04/26 19:54

思路:用二分法找到数字第一次和最后一次出现的位置

题目描述:

统计一个数字在排序数组中出现的次数。
输入:

每个测试案例包括两行:

第一行有1个整数n,表示数组的大小。1<=n <= 10^6。

第二行有n个整数,表示数组元素,每个元素均为int。

第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。

下面有m行,每行有一个整数k,表示要查询的数。

输出:
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。

样例输入:
81 2 3 3 3 3 4 513
样例输出:
4
#include <iostream>#include <cstdio> using namespace std;int getFirstK(int *array,int k,int Start,int End){    if(array==NULL||Start>End||k<array[Start]||k>array[End])        return -1;    int midIndex=(Start+End)/2;    int midData=array[midIndex];    if(midData==k)    {        if(midIndex==0||((midIndex>0)&&(array[midIndex-1])!=k))            return midIndex;        else            End=midIndex-1;    }    else if(midData>k)    {        End=midIndex-1;    }    else        Start=midIndex+1;    return getFirstK(array,k,Start,End);}int getLastK(int *array,int k,int Start,int End){    if(array==NULL||Start>End||k<array[Start]||k>array[End])        return -1;    int midIndex=(Start+End)/2;    int midData=array[midIndex];    if(midData==k)    {        if(midIndex==End||((midIndex<End)&&(array[midIndex+1])!=k))            return midIndex;        else            Start=midIndex+1;    }    else if(midData>k)    {        End=midIndex-1;    }    else        Start=midIndex+1;    return getLastK(array,k,Start,End);}int fun(int *array,int k,int Start,int End){    int first=getFirstK(array,k,Start,End);    int last=getLastK(array,k,Start,End);    if(first!=-1&&last!=-1)    {        return last-first+1;    }    return 0;}int array_n[1000000];//这么大的栈数组放在函数内会爆栈(2M栈),出现段错误int main(){   // freopen("input.txt","r",stdin);//    int array_n[1000000];//这么大的栈数组放在函数内会爆栈,出现段错误    int n;    int m;    int temp;    //注意在输入数据量比较大的时候cin耗时且会产生意想不到的问题改为scanf    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        {            scanf("%d",&temp);            array_n[i]=temp;        }        scanf("%d",&m);        for(int i=0;i<m;i++)        {            scanf("%d",&temp);            cout<<fun(array_n,temp,0,n-1)<<endl;        }    }    return 0;} /**************************************************************    Problem: 1349    User: fuestck    Language: C++    Result: Accepted    Time:900 ms    Memory:5424 kb****************************************************************/


0 0
原创粉丝点击