标签:begin return int 0.5 数组 排序 data 统计数字
【问题】统计一个数字在排序数组中出现的次数。
【思路】首先要清楚这种看似简单的题目,使用直接遍历是可以,但一般不得分,由于题目给出了排序数组,对于排序数组来说,常用的搜索查找方式为二分查找(binary search)。这里有个巧妙的方法,我们并不是去搜索k这个数,而是去搜索k-0.5和k+0.5这两个小数,进而返回待插入的位置!
比如:1 2 2 2 3 4 且k = 2
则,k+0.5会返回3的索引即4,而k-0.5会返回第一个2的索引即1,两者相减得3,即为最后的结果!二分代码如下,只返回begin位置!
class Solution { public: int GetNumberOfK(vector<int> data ,int k) { return biSearch(data, k+0.5) - biSearch(data, k-0.5); } private: int biSearch(vector<int>& data, double num){ int begin = 0, end = data.size() - 1; while(begin <= end){ int mid = begin + (end - begin) / 2; if(data[mid] < num) begin = mid + 1; else if(data[mid] > num) end = mid - 1; } return begin; } };
另外一个思路直接使用STL中的库函数equal_range来获取与某一个值相等的上下边界,十分好用的!
class Solution { public: int GetNumberOfK(vector<int> data ,int k) { auto res = equal_range(data.begin(), data.end(), k); return res.second - res.first; } };
标签:begin,return,int,0.5,数组,排序,data,统计数字 来源: https://www.cnblogs.com/zhudingtop/p/11385845.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。