数字在排序数组中出现的次数
来源:互联网 发布:如何提高淘宝店铺流量 编辑:程序博客网 时间:2024/06/10 07:14
二分查找算法可以用来在排序数组中快速查找一个数字。
题目描述
统计一个数字在排序数组中出现的次数。
算法:
最简单的算法o(n)
因为题目是排序数组,所以自然想到二分查找算法。
第一轮,找到指定数字第一次出现的位置。找到指定数字后,要判断前边的数字是不是k,如果不是则说明这个位置的k是第一次出现的,如果仍然是k则继续向前寻找。
第二轮,找到指定数字最后一次出现的位置。找到k后,要判断后边的数字是不是k,如果不是说明这是最后一个k的位置,如果仍然是,则继续向后寻找。
找到两个位置后,相减就是结果。在找第一个或最后一个的时候要小心数组的边界,防止溢出。
class Solution {public: //查找第一个出现的位置 int GetFirstK(vector<int>data,int start,int end,int k){ if(start > end) return -1; int mid = (start + end) /2; if(data[mid] == k){ if((mid == 0) || (mid > 0 && data[mid-1] !=k)) return mid; else end = mid - 1; } else if(data[mid] > k) end = mid - 1; else start = mid + 1; return GetFirstK(data,start,end,k); } //查找最后一次出现的位置 int GetLastK(vector<int>data,int start,int end,int k){ if(start > end) return -1; int mid = (start + end )/2; if(data[mid] == k){ int size = (int)data.size()-1; if((mid == size)||(mid < size + 1 && data[mid+1] !=k)) return mid; else start = mid + 1; } else if(data[mid]>k) end = mid - 1; else start = mid + 1; return GetLastK(data,start,end,k); } int GetNumberOfK(vector<int> data ,int k) { if(data.size() == 0) return 0; int size = (int)data.size()-1; int start = GetFirstK(data,0,size,k); int end = GetLastK(data,0,size,k); if(start!=-1 && end !=-1) return (end - start +1); else return 0; }};
0 0
- 【数组8】数字在排序数组中出现的次数
- 【数组4】数字在排序数组中出现的次数
- 数组9:数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(数组)
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- 统计一个数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- smbusers
- 使用Mac OS X终端SSH登录远程服务器
- Python读取MNIST文件
- 《C++ primer 4th》函数重载和重复声明的区别
- beego
- 数字在排序数组中出现的次数
- 从window访问hbase的问题
- web流量/镜像复制工具——gor
- JavaScript实现拖拽预览,AJAX小文件上传
- 动脑
- 35 个 Java 代码性能优化总结(复制于码农网)
- 使用delayedQueue实现你本地的延迟队列
- 【服务器学习】Idea 快捷键
- CodeForces 514D-R2D2 and Droid Army