这是谷歌的一道面试题,有两个数组A和B,假设有一个数组C,C[i] = A[j] + B[ k ] , 即C中的元素是A和B中两个元素的和。
让你求C中第K大的数字。
之前有一篇转载的用堆来求的方法,因为每出堆一次最多添加两个元素进来,所以堆的最大容量是 2* k, 所以入堆出堆复杂度是 logK, 最后的复杂度是KlogK。
注意添加的时候要判断是否已经进过堆。
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<climits>
#include<set>
#include<algorithm>
using namespace std;
struct node
{
int a,b,val;
node(int aa,int bb,int v):a(aa),b(bb),val(v){}
bool operator>(const node& oth)const
{
return val>oth.val;
}
};
int findKthSum(int A[],int m,int B[],int n,int k)
{
priority_queue<node,vector<node>,greater<node> > Q;
Q.push(node(0,0,A[0]+B[0]));
set<pair<int,int> > visited;
visited.insert(pair<int,int>(0,0));
while(!Q.empty())
{
node t=Q.top();
Q.pop();
k--;
if(k==0)
return t.val;
set<pair<int,int> &g