您的位置:首页 > 其它

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

2016-04-08 10:59 369 查看
题目:统计一个数字在排序数组中出现的次数。

比如,输入排序数组{1,2,3,3,3,3,4,5}和数字3因为3在这个数组中出现了4次。因此输出4。

题目解法非常多。关键是要找到让人惬意的方法,直接统计当然能够。但是显然不是我们要的答案。

比較好的思路例如以下:

使用二分查找的拓展,当查找的元素有反复的时,找到元素的第一个和最后一个。

这样将能够计算出该元素有多少个反复的了。二分法在数组中查找一个合乎要求的数字时间复杂度是O(logn)。因此总的时间复杂度也仅仅有O(logn)。

//递归找到排序数组中第一个k
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)
{
//推断是否是第一个k
if ((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0)
{
return middleIndex;
}
else
{//第一个k肯定在左边
end=middleIndex-1;
}
}
else if (middleData>k)
{
end=middleIndex-1;
}
else
start=middleIndex+1;
//递归
return GetFirstK(data,length,k,start,end);
}

//相同的思路,递归找到最后的一个k
int GetEndK(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)
{
end=middleIndex-1;
}
else
{
start=middleIndex+1;
}
return GetEndK(data,length,k,start,end);
}

//计算出k在数组中出现的次数
int GetNumOfK(int *data, int length, int k)
{
int number=0;
if (data!=NULL&&length>0)
{
int first=GetFirstK(data,length,k,0,length-1);
int last=GetEndK(data,length,k,0,length-1);
if (first>-1&&last>-1)
{
return last-first+1;
}
}
return number;
}
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46367393
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: