寻找两个有序数组的中位数

求中位数

 

 

 

 

 

 

 

 

 

 

求K-th(leetcode4)

由于上面的写法要求两个数组等长且是奇数,leetcode上的题长度不定,所以按中位数的写法并不好写。

如果我们能用log的复杂度找到第K个,那么很容易得到中位数.

方法大致如下:从两个数组取前K/2个,比较两部分的第K/2个,将较小的那部分去掉,在剩下的部分找K-K/2个,这就是个递归了。

class Solution {
private:
    int INF = 0x3f3f3f3f;
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size(), n = nums2.size();
        if(m == 0)
        {
            if(n&1)  return nums2[n/2];
            return (nums2[n/2-1] +  nums2[n/2])*1.0 / 2;
        }
        if(n == 0)
        {
            if(m&1)  return nums1[m/2];
            return (nums1[m/2] + nums1[m/2-1])*1.0 / 2;
        }
        int th = (m+n+1)/2, th2 = (m+n+2)/2;
        return (find_kth(nums1, 0, nums2, 0, th) + find_kth(nums1, 0, nums2, 0, th2))/2;
    }
    double find_kth(vector<int>a, int sa, vector<int>b, int sb, int k)
    {
        if(sa > a.size()-1)  return b[sb+k-1];
        if(sb > b.size()-1)  return a[sa+k-1];
        if(k == 1)  return min(a[sa], b[sb]);

        int mid_a = INF, mid_b = INF;
        if(sa + k/2-1 < a.size())  mid_a = a[sa + k/2-1];
        if(sb + k/2-1 < b.size())  mid_b = b[sb + k/2-1];

        if(mid_a < mid_b)  return find_kth(a, sa+k/2, b, sb, k-k/2);
        else  return find_kth(a, sa, b, sb+k/2, k-k/2);
    }
};

 

 

参考链接:

1. https://blog.csdn.net/qq_14821023/article/details/50806849

2. 《算法设计与分析》-董老师的PPT

 

posted @ 2020-03-08 10:31  Rogn  阅读(161)  评论(0编辑  收藏