• 算法题之Median of Two Sorted Arrays


    这道题是LeetCode上的题目,难度级别为5,刚开始做没有找到好的思路,以为是自己智商比较低,后来发现确实也比较低。。。

    题目:

    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
    

    思路是:

    对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 
    若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
    如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
    不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
    取A[k / 2] B[k / 2] 比较,
    如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
    反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的
    k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
    如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作。
    

    时间复杂度为log(m + n)的答案:

    class Solution {
    public:
        int getkth(int s[], int m, int l[], int n, int k){
            // let m <= n
            if (m > n) 
                return getkth(l, n, s, m, k);
            if (m == 0)
                return l[k - 1];
            if (k == 1)
                return min(s[0], l[0]);
    
            int i = min(m, k / 2), j = min(n, k / 2);
            if (s[i - 1] > l[j - 1])
                return getkth(s, m, l + j, n - j, k - j);
            else
                return getkth(s + i, m - i, l, n, k - i);
            return 0;
        }
        
        double findMedianSortedArrays(int A[], int m, int B[], int n) {
            int l = (m + n + 1) >> 1;
            int r = (m + n + 2) >> 1;
            return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0;
        }
    };
    

      

  • 相关阅读:
    CSS3实现0.5px的边框
    解决nvm导致终端启动慢的问题
    解决zsh: command not found: gitk,将git路径/usr/bin/git修改为/usr/local/bin/git
    MAC之zsh终端使用nvm安装指定版本node
    解决npm包node-sass下载失败问题
    forEach中使用async await的问题
    使用module-alias别名简化CommonJS的require路径
    关系型数据库的ACID
    Node.js ORM 框架对比
    mysql字符集 utf8 和utf8mb4 的区别
  • 原文地址:https://www.cnblogs.com/shixiangwan/p/7435422.html
Copyright © 2020-2023  润新知