如下实现一个方法找两个数组中第n大的数:
假定需要找nums1的下标(s1,e1)范围内nums2的下标(s2,e2)范围内的第n个大小的数, 我们先把nums1和nums2各自的中点p1, p2 找出:
问题就变成, 找上图的第nth - (p2 - s2) 个元素.
如此可以迭代下去, 到其中一对游标相遇的时候, 就很好解决了.
如上, 找到第n大的数, 问题就等于是解决了. 可以顺利找到中位数.
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// write your code here
int len1=nums1.size();
int len2=nums2.size();
int len=len1+len2;
if(len & 1){
return findKth(nums1,0,nums2,0,len/2+1);
}
return (findKth(nums1,0,nums2,0,len/2)+findKth(nums1,0,nums2,0,len/2+1))/2;
}
double findKth(vector<int>& nums1,int i1,vector<int>& nums2,int i2,int k){
if(i1>=nums1.size()){
return nums2[i2+k-1];
}
if(i2>=nums2.size()){
return nums1[i1+k-1];
}
if(k==1){
return min(nums1[i1],nums2[i2]);
}
int key1=i1+k/2-1>=nums1.size()?INT_MAX:nums1[i1+k/2-1];
int key2=i2+k/2-1>=nums2.size()?INT_MAX:nums2[i2+k/2-1];
if(key1<key2){
return findKth(nums1,i1+k/2,nums2,i2,k-k/2);
}else{
return findKth(nums1,i1,nums2,i2+k/2,k-k/2);
}
}
};