算法4. Median of Two Sorted Arrays

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

You may assume nums1 and nums2 cannot be both empty.

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

两个已经有序的数组 nums1和nums2,大小分别为m和n。
找到两个数组的中值。整体的时间复杂度应该为O(log(m+n))。
可以假定nums1和nums2不能全为空。
解:
思路一,如果不考虑时间复杂度,直接合并两个数组,然后找到中位数即可。
思路二,在思路一的基础上,其实我们只需要合并到总数的一半的时候,就可以了,剩下的不用合并。
思路三,其实也不用合并,直接用一个变量记录中数。时间复杂度大约为O((m+n)/2)。
思路四,时间复杂度要达到O(log(m+n)),是要去进行折半查找的(涉及折半的算法,时间复杂度一般为O(logn))。如果其中一个为空,那么就是在另外一个不为空的里面找;都不为空,一个数组为3个,另外一个数组有5个,也不能直接确定中数就在5个的里面;所以得找出各自的中数,然后比较大小,如果nums1中数的值比nums2的大,那么nums2折半;反之,nums1折半;超过数组大小,说明中数在另外一个数组里面。

以下为实现:

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int m = nums1.length, n = nums2.length;
    int l = (m + n + 1) / 2;
    int r = (m + n + 2) / 2;
    return (getkth(nums1, 0, nums2, 0, l) + getkth(nums1, 0, nums2, 0, r)) / 2.0;
}

public double getkth(int[] A, int aStart, int[] B, int bStart, int k) {
    if (aStart > A.length - 1) {
        return B[bStart + k - 1];
    }
    if (bStart > B.length - 1) {
        return A[aStart + k - 1];
    }
    if (k == 1) {
        return Math.min(A[aStart], B[bStart]);
    }

    int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
    if (aStart + k / 2 - 1 < A.length) {
        aMid = A[aStart + k / 2 - 1];
    }
    if (bStart + k / 2 - 1 < B.length) {
        bMid = B[bStart + k / 2 - 1];
    }

    if (aMid < bMid) {
        return getkth(A, aStart + k / 2, B, bStart, k - k / 2);
    } else {
        return getkth(A, aStart, B, bStart + k / 2, k - k / 2);
    }
}

你可能感兴趣的:(算法4. Median of Two Sorted Arrays)