#include<iostream>
using namespace std;
//两个有序数组中,求所有数中第k个大的数字
int FirstKMax(int arr1[], int arr2[], int k, int L1, int L2){
if(L1 + L2 < k)
return -1;//表示不存在第k个大的数
int count = 0;
int maxL = L1 - 1;
int minL = L2 - 1;
for(int i = maxL, j = minL; i >= 0 && j >= 0;){
while(i >= 0 && j >= 0 && arr1[i] >= arr2[j]){
count ++;
if(count >= k){
return arr1[i];
break;
}
i --;
}
while(i >= 0 && j >= 0 && arr1[i] < arr2[j]){
count ++;
if(count >= k){
return arr2[j];
break;
}
j --;
}
}
return arr1[k - count - 1];
}
//for test
int main()
{
int m, n;
cin>>m>>n;
int *arr1 = new int[m];
for(int i = 0; i < m; i ++){
cin>>arr1[i];
}
int *arr2 = new int[n];
for(int j = 0; j < n; j ++){
cin>>arr2[j];
}
int k;
cin>>k;
if(m >= n){
cout<<FirstKMax(arr1,arr2,k,m,n)<<endl;
}else{
cout<<FirstKMax(arr2,arr1,k,n,m)<<endl;
}
return 0;
}
使用小根堆的方法实现(优先队列)
//priority_queue<Type, Container, Functional>
/*Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,
比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就
是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型
时,只需要传入数据类型,默认是大顶堆
*/
/*
push():队尾插入元素
pop():队首删除元素
top():返回优先队列对顶元素,返回优先队列中有最高优先级的元素
*/
#include<iostream>
#include<queue>
using namespace std;
struct cmp{
bool operator()(int &a, int &b){
return a > b;
}
};
int FindFirstKMax(int arr1[], int arr2[], int k, int L1, int L2){
if(L1 + L2 < k)
return -1;
priority_queue<int,vector<int>, cmp> MinQue;//创建小根堆
for(int i = 0; i < k && i < L1; i ++){
MinQue.push(arr1[i]);
}
//如果k<L1,则k个元素的小根堆已经由arr1中的元素构建完成
if(k < L1){
for(int x = k; x < L1; x ++){
int topQ1 = MinQue.top();//取堆顶元素
if(arr1[x] > topQ1){
MinQue.pop();
MinQue.push(arr1[x]);
}
}
for(int y = 0; y < L2; y ++){
int topQ2 = MinQue.top();
if(arr2[y] > topQ2){
MinQue.pop();
MinQue.push(arr2[y]);
}
}
}
//否则,继续加入(k-L1)个arr2中的元素构成小根堆
else{ //k >= L1
int j = 0;
for(; j < k - L1; j ++){
MinQue.push(arr2[j]);
}
//讨论剩余的元素加入到小根堆中的情况
for(int s = j; s < L2; s ++){
int topQ3 = MinQue.top();
if(arr2[s] > topQ3){
MinQue.pop();
MinQue.push(arr2[s]);
}
}
}
return MinQue.top();
}
int main()
{
int m, n;
cin>>m>>n;
int *arr1 = new int[m];
for(int i = 0; i < m; i ++){
cin>>arr1[i];
}
int *arr2 = new int[n];
for(int j = 0; j < n; j ++){
cin>>arr2[j];
}
int k;
cin>>k;
cout<<FindFirstKMax(arr1,arr2,k,m,n)<<endl;
return 0;
}