求排序数组中数字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
- 求排序数组中数字k出现的次数
- 数字 k 在排序数组 arr 中出现的次数
- 数组中出现次数第k多的数字(求次数前k多的问题)
- 在一个排序数组中求一个数K出现的次数
- java 求数字在排序数组中出现的次数(O(logn))
- 【数组8】数字在排序数组中出现的次数
- 【数组4】数字在排序数组中出现的次数
- 数组9:数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(数组)
- 求一个数组中各数字出现的次数
- 求数字在数组中出现的次数
- 求数组中出现次数超过一半的数字
- 求数组中出现次数超过一半的数字
- 求数组中出现次数超过一半的数字
- 求数组中出现次数超过一半的数字
- 求数字在非降序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- SQL Server 事务与隔离级别
- 实验十二 图的建立与遍历
- python 读写文件基本操作方法
- 容器的resize()和reserve()用法
- (七)探索TiledMap和Display
- 求排序数组中数字k出现的次数
- 程序员掌中宝手册 适合it 手机白领 淘宝 物联网 芯片设计 cnoswinnnuixs 电脑维修人员第一章 写给中老年人朋友 1.2
- 【转自“果壳网”微软亚洲学院】光学字符识别技术:让电脑“读”懂世界
- HTTP协议之GET和POST
- session超时设置
- vim 替换命令
- Akka 2.1尝试的一个小例子
- cocos2dx游戏任务系统开发之服务端数据库
- hibernate监听器的配置,在spring中