题目描述 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 }
View Code

相关文章:

  • 2021-07-02
  • 2021-11-18
  • 2022-12-23
  • 2021-07-26
  • 2021-09-16
  • 2021-09-26
  • 2021-10-25
  • 2022-12-23
猜你喜欢
  • 2021-04-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-05
  • 2022-12-23
相关资源
相似解决方案