数字在排序数组中出现的次数
2016-04-08 10:59
369 查看
题目:统计一个数字在排序数组中出现的次数。
比如,输入排序数组{1,2,3,3,3,3,4,5}和数字3因为3在这个数组中出现了4次。因此输出4。
题目解法非常多。关键是要找到让人惬意的方法,直接统计当然能够。但是显然不是我们要的答案。
比較好的思路例如以下:
使用二分查找的拓展,当查找的元素有反复的时,找到元素的第一个和最后一个。
这样将能够计算出该元素有多少个反复的了。二分法在数组中查找一个合乎要求的数字时间复杂度是O(logn)。因此总的时间复杂度也仅仅有O(logn)。
比如,输入排序数组{1,2,3,3,3,3,4,5}和数字3因为3在这个数组中出现了4次。因此输出4。
题目解法非常多。关键是要找到让人惬意的方法,直接统计当然能够。但是显然不是我们要的答案。
比較好的思路例如以下:
使用二分查找的拓展,当查找的元素有反复的时,找到元素的第一个和最后一个。
这样将能够计算出该元素有多少个反复的了。二分法在数组中查找一个合乎要求的数字时间复杂度是O(logn)。因此总的时间复杂度也仅仅有O(logn)。
//递归找到排序数组中第一个k int GetFirstK(int *data, int length, int k, int start, int end) { if(start>end) return -1; int middleIndex=(start+end)/2; int middleData=data[middleIndex]; if (middleData==k) { //推断是否是第一个k if ((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0) { return middleIndex; } else {//第一个k肯定在左边 end=middleIndex-1; } } else if (middleData>k) { end=middleIndex-1; } else start=middleIndex+1; //递归 return GetFirstK(data,length,k,start,end); } //相同的思路,递归找到最后的一个k int GetEndK(int *data, int length, int k, int start, int end) { if(start>end) return -1; int middleIndex=(start+end)/2; int middleData=data[middleIndex]; if (middleData==k) { if ((middleIndex<length-1&&data[middleIndex+1]!=k)||middleIndex=length-1) { return middleIndex; } else start=middleIndex+1; } else if (middleData>k) { end=middleIndex-1; } else { start=middleIndex+1; } return GetEndK(data,length,k,start,end); } //计算出k在数组中出现的次数 int GetNumOfK(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=GetEndK(data,length,k,0,length-1); if (first>-1&&last>-1) { return last-first+1; } } return number; }转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46367393
相关文章推荐
- python 列表的操作(添加删除)列表和元组的区别
- Js运动框架
- 连接的管道(最小生成树)
- 腾讯2016实习生笔试编程题 打印蛇形矩阵的递归做法
- javascript设计模式(二)--闭包实现
- python解析:Java环境配置简化版
- ‘Debug\CppDllExport.pch’ unexpected precompiled header error, simply rerunning the compiler might fi
- XML和HTML常用转义字符
- BZOJ 1030 文本生成器
- Fabric:系统批量运维管理器!!!
- Linux ss --获取socket统计信息及显示netstat类型的内容
- Linux split --分割文件
- 支持向量机通俗导论(理解SVM的三层境界)
- 如何实现工作流控件BizFlow 的分支
- c++第二次实验 作业
- java中的==、equals()、hashCode()
- Python的包管理
- adbWireless 简单教程
- redis安装、配置、启停
- MyEclipse 2016 CI 1支持远程WebSphere连接器