Leetcode 4. Median of Two Sorted Array

题目

There are two sorted arrays nums1 and nums2 of size x and y respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log(x + y)).

You may assume nums1 and nums2 can not 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

思路

要解决这个问题,我们需要先理解“中位数有什么用?”。在统计学中,中位数用于将集合划分为两个相等长度的子集,一个子集总是大于另一个子集。如果我们理解了中位数对集合的划分,我们就非常接近答案了。

首先,在一个随机的位置paritionX将集合nums1划分为两部分。

由于nums1x个元素,所以就有x+1种分法(partitionX=0~x)。由此可知: len(leftNums1) = partitionX, len(rightNums1) = x - partitionX。 注意:当partitionX = 0时,leftNums1为空,而当paritionX = x时,rightNums1为空。

同理,在一个随机的位置paritionY将长度为y的集合nums2划分为两部分。

将 leftNums1 和 leftNums2 放入同一个集合,将 rightNums1 和 rightNums2 放入另外一个集合。 分别称他们为 leftPart 和 rightPart:

如果我们能达成两个条件: 1. len(leftPart) = len(rightPart) 2. max(leftPart) <= min(rightPart) 那么我们就能将{nums1, nums2}中所有元素分成两个长度相等的部分,并且其中一部分总是大于另一部分。那么中位数则为:(max(leftPart) + min(rightPart)) / 2.

为了达成这两个条件,我们只需确保: 1. partitionX + partitionY == (x + y + 1) / 2。所有元素被均匀分成两个部分。 2. maxLeftX < minRightY && maxLeftY < minRightX。 因为所有leftNums1一定比rightNums1小,满足以上条件的话leftNums1则同时也比所有的rightNums2小。nums2同理。因此,条件二保证了 leftPart < rightPart

因此,我们需要在[0, x]区间,用二分搜索法找到partitionX以满足以上两个不等式。我们可以写出以下的伪代码:

我们注意到这里左右切分部分有可能为空。为处理这种特殊情况,我们可以相应的把maxLeft设为Integer.MIN_VALUEminRight设为Integer.MAX_VALUE。以下为完整的Java代码。

解答

Complexity Analysis

  • Time Complexity: O(log(min(x, y))). 假设x < y, 那么我们在[0, x]的范围内进行了二分搜索,每次搜索范围会减半,因此我们总共需要log(x)次循环。每次循环仅需constant time。因此总共时间为O(log(min(x, y))).

  • Space Complexity: O(1)。我们并未使用任何额外的空间。

拓展

  • 假设两个input array中有一个没有被sorted,我们能使用什么办法找到他们的中点呢?

总结

题目中的sorted提示我们使用二分搜索,但我们很难发现如何使用。我们需要对中位数的特性有很强的感知能力,而且需要大量训练锻炼出天才般的敏锐度才能想出这题的解法。 不过,我们可以举一反三,在今后将这个题目的思想应用至其他类似的题目中去。

原文链接

以上解答由下面视频讲解与解答综合得来,有增改。

Last updated

Was this helpful?