zoukankan      html  css  js  c++  java
  • 寻找两个有序数组的中位数

    求中位数

     

     

     

     

     

    求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

  • 相关阅读:
    ActiveMQ之Topic
    ActiveMQ之Queue
    ActiveMQ.xml文件的主要配置
    koa/redux middleware 深入解析
    js在工作中遇到的一些问题
    rxjs-流式编程
    端到端测试工具--testcafe
    js match函数注意
    深入js正则
    滚动联动-单独滚动与文档滚动
  • 原文地址:https://www.cnblogs.com/lfri/p/12441211.html
Copyright © 2011-2022 走看看