问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{1,2,2,2,3,4,5} 数字2的出现次数为3。
最简单的方法是遍历数组,代码如下:
#include <stdio.h>
//如何在有序数组中给出指定数字出现的次数
int binarysearch(int *a,int n,int x)
{
int cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]==x)
cnt++;
}
return cnt;
}
int main()
{
int a[10]={1,2,3,4,5,6,6,6,9,10};
printf("%d\n",binarysearch(a,10,6));
return 0;
}
在这里我认为可以利用数组有序来优化比较次数,希望大家讨论,题目来源某知名互联网公司实习面试题.
代码如下:
#include <stdio.h>
//如何在有序数组中给出给定数字出现的次数
int binarysearch(int *a,int low,int high,int x)
{
int cnt=0;
int temp;
int mid=(low+high)/2;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]<x)
low=mid+1;
else if(a[mid]>x)
high=mid-1;
else
{
temp=mid;
//程序运行到这元素x已经出现一次
cnt++;
while(a[++mid]==x)
cnt++;
while(a[--temp]==x)
cnt++;
return cnt;
}
}
//查找失败,返回0
return 0;
}
int main()
{
int a[10]={1,2,3,4,5,6,6,6,9,10};
printf("%d\n",binarysearch(a,0,10,6));
return 0;
}
思路:
首先二分查找找到对应元素,如果查找失败返回0,如果查找成功,记录当前位置,往两侧判断,程序结构上虽然看起来比较复杂,如果数组规模较大,效率方面有不少提升,希望有更好方法的朋友能够不吝赐教。