0004. Median of Two Sorted Arrays

Description

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
1
2
3
4

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5
1
2
3
4

(en)https://leetcode.com/problems/median-of-two-sorted-arrays/
(中文)https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

Solutions

Solution1

由于在做题时,实在没有想到什么高效的解法,因此,直接使用归并排序 (MergeSort) 中归并的想法。将两个已排序数组归并起来,然后再取中间值。

注意

此解法并不满足题目要求时间复杂度需求 O(log(m+n))O(log(m+n))

/*
   Complexity Analysis:
   Time complexity: O(m +n )
   Space complexity: O(m + n)
   */
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    // using the idea of mergeSort
    int m = nums1.length;
    int n = nums2.length;

    int[] merged = new int[m + n];

    int left = 0, right = 0;
    for (int i = 0; i < merged.length; i++) {
        if (left >= m) // no elements left in nums1
            merged[i] = nums2[right++];
        else if (right >= n) // no elements left in nums2
            merged[i] = nums1[left++];
        else if (nums1[left] < nums2[right])
            merged[i] = nums1[left++];
        else
            merged[i] = nums2[right++];
    }
    // if only one element in the merged array.
    if (merged.length == 1)
        return merged[0];

    int mid = merged.length / 2;
    return merged.length % 2 == 0 ? (double)(merged[mid]+merged[mid-1]) /2: (double)(merged[mid]);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Submission status

果然,提交完之后,发现击败 4.564.56% 的人而已,运行时间 32 ms。显然,这种做法并不是理想的解法。