zoukankan      html  css  js  c++  java
  • leetcode 4. Median of Two Sorted Arrays

    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)).

    Example 1:
    nums1 = [1, 3]
    nums2 = [2]
    
    The median is 2.0
    Example 2:
    nums1 = [1, 2]
    nums2 = [3, 4]
    
    The median is (2 + 3)/2 = 2.5
    

    问题转换为求第k小的值问题。假设有2个数组一共有5个数,那么第3小的值就是中位数。假设有2个数组6个数,那么第3小和第4小的数的平均值就是其中位数。

    题目要求用O(log(n+m))的时间复杂度,可以用二分去解决(参考网上).
    思路:首先假设数组a和b的元素个数都大于k/2,我们比较a[k/2-1]b[k/2-1]两个元素,这两个元素分别表示a的第k/2小的元素和b的第k/2小的元素。
    这两个元素比较共有三种情况:>、<和=。如果a[k/2-1]<b[k/2-1],这表示a[0]到a[k/2-1]的元素都在a和b合并之后的前k小的元素中。换句话说,a[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。

    a[k/2-1]>b[k/2-1]时存在类似的结论。抛弃b数组的前k/2个元素。

    a[k/2-1]=b[k/2-1]时,我们已经找到了第k小的数,也即这个相等的元素.
    还有一些边界情况:
    如果a或者b为空,则直接返回b[k-1]或者a[k-1];
    如果k为1,我们只需要返回a[0]和b[0]中的较小值;
    如果a[k/2-1]=b[k/2-1],返回其中一个

    代码如下:

    class Solution {
    public:
        int findK(vector<int>& a, int as, int n, vector<int>& b, int bs, int m, int k) {
            if (n > m) return findK(b, bs, m, a, as, n, k);
            if (n == 0) return b[bs+k-1];
            if (k == 1) return min(a[as], b[bs]);
            int l = min(n, k/2); 
            int r = k - l;
            if (a[as+l-1] > b[bs+r-1]) {
                return findK(a, as, n, b, bs+r, m-r, k-r);
            } else if (a[as+l-1] < b[bs+r-1]){
                return findK(a,  as+l, n-l, b, bs, m, k-l);
            } else {
                return a[as+l-1];
            }
        }
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int n = nums1.size();
            int m = nums2.size();
            int k = (n+m)/2;
            if ((m+n)%2 == 1) {
                return findK(nums1, 0, n, nums2, 0, m, k+1);
            }
            else {
                return (findK(nums1, 0, n, nums2, 0, m, k) + findK(nums1, 0, n, nums2, 0, m, k+1)) / 2.0;
            }
        }
    };
    
  • 相关阅读:
    [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)
    [BZOJ 4318]OSU!(期望dp)
    [Codeforces Round #146 (Div. 1) B]Let's Play Osu!(期望Dp)
    [Codeforces Round #261 (Div. 2) E]Pashmak and Graph(Dp)
    [Codeforces Round #301 (Div. 2) D]Bad Luck Island(概率Dp)
    [Codeforces Round #284 (Div. 1) B]Name That Tune(概率Dp)
    [UVALive 7143]Room Assignment(Dp)
    [BZOJ 1076][SCOI2008]奖励关(期望+状压Dp)
    【DBMS HKUST slides8】范式及分解算法 知识点总结
    【DBMS HKUST slides1~6】数据库管理系统 知识点总结
  • 原文地址:https://www.cnblogs.com/pk28/p/8490649.html
Copyright © 2011-2022 走看看