码迷,mamicode.com
首页 > 其他好文 > 详细

4. Median of Two Sorted Arrays

时间:2016-05-04 22:38:00      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

有两个有序数组nums1和nums2,长度分别为m和n,找到两个数组的中位数。

对于两个有序数组的中位数可以转化为求第k个数,如果n+m为偶数那么返回第k和k+1个数的平均值,如果n+m为奇数直接返回k即可,k = (n+m+1)/2,

函数传入起始值和终止值来标注数组的范围,注意要处理一些corners,例如nums1用完或者nums2用完时,或者k=1的时候,

最后要处理的是一般情况,比较nums1[k/2]和nums2[k/2],并将小的那一段丢弃,当然还要考虑两个数组的范围限制,代码如下:

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int n1 = nums1.size();
    int n2 = nums2.size();
    if (0 == n1+n2)
        return 0;

    return GetMid(nums1, 0, n1-1, nums2, 0, n2-1, (n1+n2+1)/2, 0==(n1+n2)%2);
}

// 找到第k个数,beven表示是否一共有偶数个元素,如果是偶数个则要选择第k和第k+1个的平均值返回,否则返回第k个
double GetMid(vector<int>& nums1, int i, int j, vector<int>& nums2, int s, int t, int k, bool beven) { if (i>j)  // nums1 用完了 { if (!beven) return nums2[s+k-1]; else return (nums2[s+k-1]+nums2[s+k])/2.0; } if (s>t)  // nums2 用完了 { if (!beven) return nums1[i+k-1]; else return (nums1[i+k-1]+nums1[i+k])/2.0; } if (1 == k) // 找第一个,那么直接返回nums1和nums2的头部位置 { if (!beven) return min(nums1[i], nums2[s]); else { if (nums1[i] <= nums2[s]) return (nums1[i] + (i<j?min(nums1[i+1],nums2[s]):nums2[s]) )/2.0; else return (nums2[s] + (s<t?min(nums1[i],nums2[s+1]):nums1[i]) )/2.0; } }

   // 否则比较nums1[k/2]和nums2[k/2],将小的那一段丢弃
int L = min(j-i+1, k/2); int R = min(k-L, t-s+1); L = k - R; if (nums1[i+L-1] == nums2[s+R-1]) { if (!beven) return nums1[i+L-1]; else return (nums1[i+L-1] + min(nums1[i+L],nums2[s+R]))/2.0; } if (nums1[i+L-1] < nums2[s+R-1]) return GetMid(nums1, i+L, j, nums2, s, t, k-L, beven); return GetMid(nums1, i, j, nums2, s+R, t, k-R, beven); }

 

4. Median of Two Sorted Arrays

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5459793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!