这篇文章主要介绍了C++如何实现的O(n)复杂度内查找第K大数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
专注于为中小企业提供成都做网站、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业聂拉木免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。具体如下:
题目:是在一组数组(数组元素为整数,可正可负可为0)中查找乘积大的三个数,最后输出大乘积。
从题目我们知道只有两种结果存在:
1)三个大的正整数相乘;
2)一个大的正整数和两个最小的负数相乘。
所以我们需要找出数组中大的三个数的乘积m,然后与数组中最小的两个数相乘再与大的数相乘的结果n,然后比较m,n,选出大的数即为最终的结果。
参考代码:https://www.jb51.net/article/121189.htm
实现代码:
#include#include //分区 int partition(std::vector &vec,int start,int end) { int value=vec[end]; int tail=start-1; for(int i=start;i &vec,int start,int end,int k) { //快排思想,进行分区,快排复杂度为O(nlgn),但取最值只比较分区的一个区间,所以为O(n) int now = partition(vec,start,end); if(k < now) return solve(vec,start,now-1,k); else if(k > now) return solve(vec,now+1,end,k); else return vec[now]; } int main() { int n;//要比较的数的个数 while(std::cin>>n) { std::vector vec_i(n,0);//使用vector存储n个数 for(int i = 0; i < n; ++i) { std::cin>>vec_i[i]; } int k; //大的数,index为n-1 k = n - 1; long long x1 = solve(vec_i,0, n-1,k); //次大的数,index为n-2 k = n - 2; long long x2 = solve(vec_i,0, n-2,k); //第三大的数 k = n - 3; long long x3 = solve(vec_i,0, n-3,k); long long Ans = x1 * x2 * x3;//大的三个数的乘积 if(n > 3) { //最小的数,index为0 k = 0; long long y1 = solve(vec_i,0, n-1,k); //次小的数,index为1 k = 1; long long y2 = solve(vec_i,0, n-2,k); Ans = std::max(Ans, y1*y2*x1);//两者比较取大 } std::cout< 感谢你能够认真阅读完这篇文章,希望小编分享的“C++如何实现的O(n)复杂度内查找第K大数”这篇文章对大家有帮助,同时也希望大家多多支持创新互联建站,关注创新互联网站建设公司行业资讯频道,更多相关知识等着你来学习!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
新闻标题:C++如何实现的O(n)复杂度内查找第K大数-创新互联
文章源于:http://cdkjz.cn/article/dijipd.html