1. 程式人生 > >算法題之Median of Two Sorted Arrays

算法題之Median of Two Sorted Arrays

數據規模 leetcode blog 後來 證明 sorted == 操作 個數

這道題是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;
    }
};

  

算法題之Median of Two Sorted Arrays