给定两个有序数组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 都转换成了求中位数了
代码:
例如:
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 都转换成了求中位数了
代码:
- /*
- 两个有序数组中找到第k大的数,时间复杂度为O(lg{min(M,N)})
- 这里的输入假设arr1的长度要小于等于arr2的长度。
- */
- int getKTopProcess(int *arr1, int start1, int end1, int *arr2, int start2, int end2, int k){
- int length1 = end1 - start1 + 1; // 假定length1 <= length2
- int length2 = end2 - start2 + 1;
- if(k <=0 || k >length1+length2) return 0;// 不存在
- // 如果k小于length1, 就相当于找arr1与arr2前k个元素的上中位数
- if(k <= length1) return findMedianProcess2(arr1, start1, k-1, arr2, start2, k-1);
- // 如果k在length1和length2 之间,那么就是取arr1与arr2在[k-length1,k-length1+9]之间的上中位数
- else if(k < length2){
- if(arr2[k-length1-1] >= arr1[end1])return arr2[k-length1-1];
- else return findMedianProcess2(arr1, start1, end1, arr2, k-length1, k-length1+9);
- }
- // 第三种情况k大于等于length2 都转换成了求中位数了
- else{
- if(arr2[k-length1-1]>=arr1[end1])return arr2[k-length1-1];
- else if(arr1[k-length2-1] >= arr2[end2]) return arr1[k-length2-1];
- else return findMedianProcess2(arr1, k-length2, end1, arr2, k-length1, end1);
- }
- }