题目描述 Description
给出两个有序数组A和B(从小到大有序),合并两个有序数组后新数组c也有序,询问c数组中第k大的数
假设不计入输入输出复杂度,你能否给出一个O(logN)的方法?
输入描述 Input Description
第一行输入三个整数n、m和k
第二行输入n个用空格隔开的整数表示数组A
第三行输入m个用空格隔开的整数表示数组B
输入保证A和B数组非递减
输出描述 Output Description
合并两个数组之后的第k大的数
样例输入 Sample Input
2 3 4
1 2
1 1 5
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
1<=n,m<=1000000
1<=k <=n+m
算法一:O(m+n+k)
做类似于归并排序的合并,但是没有使用额外的空间。
1 #include <stdio.h> 2 long long n,m,k,a[1000005],b[1000005]; 3 long long findKthSMallest() 4 { 5 int ai=0,bi=0; 6 while(k>0) 7 { 8 if(ai<n&&bi<m) 9 { 10 if(a[ai]<=b[bi]) 11 { 12 if(k==0) return a[ai]; 13 ai++; 14 } 15 else if(b[bi]<=a[ai]) 16 { 17 if(k==0) return b[bi]; 18 bi++; 19 } 20 } 21 else if(ai<n&&bi==m) 22 { 23 if(k==0) return a[ai]; 24 ai++; 25 } 26 else if(ai==n&&bi<m) 27 { 28 if(k==0) return b[bi]; 29 bi++; 30 } 31 else return -1; 32 33 k--; 34 } 35 } 36 int main(int argc, char *argv[]) 37 { 38 int i; 39 scanf("%d%d%d",&n,&m,&k); 40 for(i=0;i<n;i++) scanf("%d",&a[i]); 41 for(i=0;i<m;i++) scanf("%d",&b[i]); 42 printf("%d\n",findKthSMallest()); 43 return 0; 44 }