原题地址
题目内容
题目分析
看到题目第一眼想到的就是采用merge的做法,将两个数列从第一个开始比较排序,不过这样的做法复杂度就变为O(n),不符合题目的要求。后面参考了leetcode上面的discuss以及别人的博客,就采用了分治的做法,主要思想就是求数列中第k大的数。
举个例子
代码实现
double getkth(int* nums1, int size1, int* nums2, int size2,int k){
if(size1 == 0){
return nums2[k-1];
}
if(size2 == 0){
return nums1[k-1];
}
if(k == 1){
return nums1[0]<nums2[0]?nums1[0]:nums2[0];
}
int i = size1<(k/2)?size1:(k/2);
int j = size2<(k/2)?size2:(k/2);
if(nums1[i-1] > nums2[j-1]){
return getkth(nums1,size1,nums2+j,size2-j,k-j);
}
else return getkth(nums1+i,size1-i,nums2,size2,k-i);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int tot = nums1Size + nums2Size;
if(tot % 2 == 0){
return (getkth(nums1, nums1Size, nums2, nums2Size,tot/2)+getkth(nums1,nums1Size,nums2,nums2Size,tot/2+1))/2.0;
}else{
return getkth(nums1, nums1Size, nums2, nums2Size,tot/2+1);
}
}
本文探讨了寻找两个有序数组中位数的有效算法。通过对比merge法的局限性,提出了一种分治策略来高效求解第k大的元素,最终实现了O(log(min(m,n)))的时间复杂度。
670

被折叠的 条评论
为什么被折叠?



