如何在有序数组中给出指定数字出现的次数

来源:互联网 发布:2016年农业保险数据 编辑:程序博客网 时间:2024/06/06 13:13

问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{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;}}//查找失败,返回0return 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,如果查找成功,记录当前位置,往两侧判断,程序结构上虽然看起来比较复杂,如果数组规模较大,效率方面有不少提升,希望有更好方法的朋友能够不吝赐教。

1 0
原创粉丝点击