试题

给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数。
例如:
arr1 ={1,2,3,4,5};
arr2 ={3,4,5};
K = 1;
因为1为所有数中最小的,所以返回1;
arr1 ={1,2,3};
arr2 ={3,4,5,6};
K = 4;
因为3为所有数中第4小的数,所以返回3;
要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。
分析: 此题比较难,我们需要对k分三种情况,并调用第4题的答案进行求解。
(1) 如果k小于length1, 就相当于找arr1与arr2前k个元素的上中位数
(2) 如果k在length1和length2 之间,那么就是取arr1与arr2在[k-length1,k-length1+9]之间的上中位数
(3) 第三种情况k大于等于length2 都转换成了求中位数了
代码:
  1. /* 
  2. 两个有序数组中找到第k大的数,时间复杂度为O(lg{min(M,N)}) 
  3. 这里的输入假设arr1的长度要小于等于arr2的长度。 
  4. */  
  5.   
  6. int getKTopProcess(int *arr1, int start1, int end1, int *arr2, int start2, int end2, int k){  
  7.     int length1 = end1 - start1 + 1;  // 假定length1 <= length2  
  8.     int length2 = end2 - start2 + 1;  
  9.     if(k <=0 || k >length1+length2) return 0;// 不存在  
  10.   
  11.     // 如果k小于length1, 就相当于找arr1与arr2前k个元素的上中位数  
  12.     if(k <= length1) return findMedianProcess2(arr1, start1, k-1, arr2, start2, k-1);  
  13.     // 如果k在length1和length2 之间,那么就是取arr1与arr2在[k-length1,k-length1+9]之间的上中位数  
  14.     else if(k < length2){  
  15.         if(arr2[k-length1-1] >= arr1[end1])return arr2[k-length1-1];  
  16.         else return  findMedianProcess2(arr1, start1, end1, arr2, k-length1, k-length1+9);  
  17.     }   
  18.     // 第三种情况k大于等于length2  都转换成了求中位数了  
  19.     else{  
  20.         if(arr2[k-length1-1]>=arr1[end1])return arr2[k-length1-1];  
  21.         else if(arr1[k-length2-1] >= arr2[end2]) return arr1[k-length2-1];  
  22.         else return  findMedianProcess2(arr1, k-length2, end1, arr2, k-length1, end1);  
  23.     }   
  24.   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值