面试题38:数字在排序数组中出现的次数

来源:互联网 发布:蚂蜂窝连app接不到网络 编辑:程序博客网 时间:2024/05/16 11:47

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数字中出现了4次,因此输出4。


算法思路:因为数组有序,利用二分查找的思想,先找出第一次出现的位置first,再找出最后一次出现的位置last,然后用last-first+1就是出现的次数。


#include <iostream>  using namespace std;  //查找K第一次出现的位置int GetFirstK(int * data,int length,int k ,int start,int end){if(start>end)return -1;int mid=(start+end)/2;//如果中间的数等于kif(data[mid]==k){//如果mid不为0并且前面那个值不为K,或者mid是第一个数字说明K第一次出现if((mid>0&&data[mid-1]!=k)||mid==0){return mid;}//否则K第一次出现的位置应该在mid左边,向前查找end=mid-1;}else if(data[mid]>k){//如果当前值大于K,说明K在mid之前end=mid-1;}else{start=mid+1;}return GetFirstK(data,length,k,start,end);}//查找K最后一次出现的位置int GetLastK(int * data,int length,int k ,int start,int end){if(start>end)return -1;int mid=(start+end)/2;//如果中间的数等于kif(data[mid]==k){//如果mid不为0并且后面那个值不为K,或者mid是最后一个数字说明K最后一次出现if((mid<end&&data[mid+1]!=k)||mid==end){return mid;}//否则K最后一次出现的位置应该在mid右边,向前查找start=mid+1;}else if(data[mid]>k){//如果当前值大于K,说明K在mid之前end=mid-1;}else{start=mid+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);int last=GetLastK(data,length,k,0,length-1);if(first>-1&&last>-1){number=last-first+1;}}return number;}int main()  {   int data[]={1,2,3,3,3,3,4,5};cout<<GetNumberOfK(data,8,3)<<endl;    return 0;  }  


0 0
原创粉丝点击