求排序数组中数字k出现的次数

来源:互联网 发布:常用mysql语句大全 编辑:程序博客网 时间:2024/06/05 03:21

思路:如果从头到尾遍历数组,那时间复杂度是O(n).我们可以利用题目给出的条件,由于是排序数组,我们可以利用二分查找来实现 时间复杂度为O(log2N)


具体代码如下:

#include<iostream>#include<cassert>using namespace std;int findfirstk(int *ar, int len, int k, int start, int end)//利用二分查找找到第一个k出现的位置{if(start > end){return -1;}int mid = (end-start)/2 +start;if(ar[mid] == k){if(mid>0&&ar[mid-1]!=k || mid==0)//找到第一个k{return mid;}else{end = mid - 1;}}else if(ar[mid] > k){end = mid - 1;}else{start = mid + 1;}return findfirstk(ar, len, k, start, end);}int findlastk(int *ar, int len, int k, int start, int end)//利用二分查找找到最后一个k出现的位置{if(start > end){return -1;}int mid = (end-start)/2 +start;if(ar[mid] == k){if(mid<len-1&&ar[mid+1]!=k || mid==len-1)//找到最后一个k{return mid;}else{start = mid + 1;}}else if(ar[mid] > k){end = mid - 1;}else{start = mid + 1;}return findlastk(ar, len, k, start, end);}int gettimesk(int *ar, int len, int k){assert(ar != NULL);int times = 0;int first = findfirstk(ar, len, k, 0, len-1);int last = findlastk(ar, len, k, 0, len-1);if(first>-1 && last>-1 && len>0){times = last-first+1;}return times;}int main(){int ar[] = {1,2,3,4,4,5,6,6,6,6,6,7,7,7,7,8,8,9,9,9,9,9,10};int len = sizeof(ar)/sizeof(ar[0]);int k;cin>>k;cout<<"数字 "<<k<<" 出现了 "<<gettimesk(ar, len, k)<<" 次"<<endl;return 0;}


0 0
原创粉丝点击