当前位置: 首页 > news >正文

(算法)前K大的和

题目:

1、有两个数组A和B,每个数组有k个数,从两个数组中各取一个数加起来可以组成k*k个和,求这些和中的前k大。

2、有N个数组,每个数组有k个数,从N个数组中各取一个数加起来可以组成k^N个和,求这些和中的前k大。

思路:

1、将A和B两个数组,按照从大到小排序,那么很容易得到下面的求和矩阵,假设为C,仔细一看,貌似有点规律。

C[0][0]=A[0]+B[0]肯定是最大的,那么候选的第二大的为max(C[0][1],C[1][0])。

我们通过堆来实现,每次从堆中找出最大值C[i][j],然后把C[i+1][j]和C[i][j+1]加入堆中,直至找到k个最大数。

2、先对前两个数组求前k大和,将结果与第三个数组求前k大和,然后第四个……直到第N个。

代码:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

struct node{
    int i;
    int j;
    int val;
    node(int x,int y,int v):i(x),j(y),val(v){};
/*
    int operator<(node m) const{
        return val-m.val;
    }
    */
};

struct cmp{
    bool operator()(const node &a,const node &b)const{
        return a.val<b.val;
    }
};

void getKthSum(const vector<int> &arr1,const vector<int> &arr2,int k,vector<int> &result){
    int sz1=arr1.size();
    int sz2=arr2.size();

    if(sz1==0 || sz2==0){
        return;
    }
    
    vector<vector<bool> > visited(sz1,vector<bool>(sz2,false));
    priority_queue<node,vector<node>,cmp> pq;
    int sum=arr1[0]+arr2[0];
    pq.push(node(0,0,sum));
    visited[0][0]=true;
    //result.push_back(sum);
    int count=0;

    while(!pq.empty() && count<k){
        node e=pq.top();
        pq.pop();
        result.push_back(e.val);

        count++;
        int ex1=e.i+1;
        int ey1=e.j;
        int ex2=e.i;
        int ey2=e.j+1;
        if(ex1<sz1 && !visited[ex1][ey1]){
            pq.push(node(ex1,ey1,arr1[ex1]+arr2[ey1]));
            visited[ex1][ey1]=true;
        }
        if(ey2<sz2 && !visited[ex2][ey2]){
            pq.push(node(ex2,ey2,arr1[ex2]+arr2[ey2]));
            visited[ex2][ey2]=true;
        }
    }
}

int main(){
    int m,n,k;
    while(cin>>m>>n>>k){
        vector<int> result; 
        vector<int> arr1(m);
        vector<int> arr2(n);

        for(int i=0;i<m;i++)
            cin>>arr1[i];
        for(int i=0;i<n;i++)
            cin>>arr2[i];
        sort(arr1.begin(),arr1.end(),greater<int>());
        sort(arr2.begin(),arr2.end(),greater<int>());
        getKthSum(arr1,arr2,k,result);

        for(int k=0;k<result.size();k++)
            cout<<result[k]<<" ";
        cout<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/AndyJee/p/4839104.html

相关文章:

  • 解决Struts配置文件中无提示信息的问题
  • ios开发:Core Data概述
  • 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置
  • 【Struts2学习笔记(2)】Action配置中的各项默认值和Action中result的各种转发类型
  • Maven POM.xml (转)
  • 【Struts2学习笔记(3)】为Action的属性注入值
  • Swift - 使用atlas图集实现动画效果(SpriteKit游戏开发)
  • 【Struts2学习笔记(4)】指定需要Struts 2处理的请求后缀和细说常量定义
  • Java学习之路:ArrayList用法
  • 【Struts2学习笔记(5)】Struts2的处理流程及工作原理
  • 【Struts2学习笔记(6)】Action动态方法调用
  • 【LINUX】主进程、父进程、子进程、守护进程的概念
  • 【Struts2学习笔记(7)】类型转换器的两种方法
  • Swift - 使用MapKit显示地图,并在地图上做标记
  • 【Struts2学习笔记(8)】访问或添加request/session/application属性获取HttpServletRequest / HttpSession / ServletContex
  • 分享的文章《人生如棋》
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [数据结构]链表的实现在PHP中
  • 【Amaple教程】5. 插件
  • CSS魔法堂:Absolute Positioning就这个样
  • in typeof instanceof ===这些运算符有什么作用
  • Java 多线程编程之:notify 和 wait 用法
  • Netty 4.1 源代码学习:线程模型
  • Quartz初级教程
  • Redis 懒删除(lazy free)简史
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring boot 整合mybatis 无法输出sql的问题
  • TypeScript实现数据结构(一)栈,队列,链表
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 关于springcloud Gateway中的限流
  • 使用agvtool更改app version/build
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 我有几个粽子,和一个故事
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3)llvm ir转换过程
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十)c52学习之旅-定时器实验
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (算法)N皇后问题
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)Linq学习笔记
  • (转)为C# Windows服务添加安装程序
  • ../depcomp: line 571: exec: g++: not found
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net 代码性能 - (1)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...