试题

来源:互联网 发布:淘宝高仿鞋可信店铺 编辑:程序博客网 时间:2024/06/10 05:09
给定两个有序数组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 都转换成了求中位数了
代码:
[cpp] view plain copy
  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