试题

来源:互联网 发布:银行招数据库管理吗 编辑:程序博客网 时间:2024/06/10 08:55
给定两个有序数组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 都转换成了求中位数了
代码:
/*两个有序数组中找到第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 <= length2int 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);} }

0 0
原创粉丝点击