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


    求中位数

     

     

     

     

     

    求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

  • 相关阅读:
    如何封装一个Ajax函数
    了解Ajax及Ajax如何发送请求
    jQuery的animate动画方法及动画排队问题解决
    jQuery的几种显示隐藏方法
    冲鸭!电瓶车
    Qt中使用HTTPS
    空非空
    河西走廊
    “财富自由”者之殇
    说鞋
  • 原文地址:https://www.cnblogs.com/lfri/p/12441211.html
Copyright © 2020-2023  润新知