C++如何实现的O(n)复杂度内查找第K大数-创新互联

这篇文章主要介绍了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://myzitong.com/article/dijipd.html