Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
Example 1:
Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Constraints:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
Solutions
Solution 1: Divide and Conquer
Thinking
Merging the two sorted arrays and then reading the median is the direct approach, in \(O(m+n)\). \(m,n \le 10^3\) would pass, but the problem asks for \(O(\log(m+n))\), so a linear scan is out.
The bottleneck: the median only cares about the one or two middle positions after a merge. Smaller values need only be counted, not listed. Both arrays are sorted, so comparing each side’s \(\left\lfloor k/2 \right\rfloor\)-th element tells us which side’s first half cannot contain the \(k\)-th smallest, and we can drop that half at once.
So we never build a merged array; we search for the \(k\)-th remaining element. The median is the average of the \(\left\lfloor (m+n+1)/2 \right\rfloor\)-th and the \(\left\lfloor (m+n+2)/2 \right\rfloor\)-th, covering odd and even length with the same code. If one side has fewer than \(\left\lfloor k/2 \right\rfloor\) elements, treat it as \(+\infty\) and discard from the other side.
The problem requires the time complexity of the algorithm to be \(O(\log (m + n))\), so we cannot directly traverse the two arrays, but need to use the binary search method.
If \(m + n\) is odd, then the median is the \(\left\lfloor\frac{m + n + 1}{2}\right\rfloor\)-th number; if \(m + n\) is even, then the median is the average of the \(\left\lfloor\frac{m + n + 1}{2}\right\rfloor\)-th and the \(\left\lfloor\frac{m + n + 2}{2}\right\rfloor\)-th numbers. In fact, we can unify it as the average of the \(\left\lfloor\frac{m + n + 1}{2}\right\rfloor\)-th and the \(\left\lfloor\frac{m + n + 2}{2}\right\rfloor\)-th numbers.
Therefore, we can design a function \(f(i, j, k)\), which represents the \(k\)-th smallest number in the interval \([i, m)\) of array \(nums1\) and the interval \([j, n)\) of array \(nums2\). The median is the average of \(f(0, 0, \left\lfloor\frac{m + n + 1}{2}\right\rfloor)\) and \(f(0, 0, \left\lfloor\frac{m + n + 2}{2}\right\rfloor)\).
The implementation idea of the function \(f(i, j, k)\) is as follows:
If \(i \geq m\), it means that the interval \([i, m)\) of array \(nums1\) is empty, so directly return \(nums2[j + k - 1]\);
If \(j \geq n\), it means that the interval \([j, n)\) of array \(nums2\) is empty, so directly return \(nums1[i + k - 1]\);
If \(k = 1\), it means to find the first number, so just return the minimum of \(nums1[i]\) and \(nums2[j]\);
Otherwise, we find the \(\left\lfloor\frac{k}{2}\right\rfloor\)-th number in the two arrays, denoted as \(x\) and \(y\). (Note, if a certain array does not have the \(\left\lfloor\frac{k}{2}\right\rfloor\)-th number, then we regard the \(\left\lfloor\frac{k}{2}\right\rfloor\)-th number as \(+\infty\).) Compare the size of \(x\) and \(y\):
If \(x \leq y\), it means that the \(\left\lfloor\frac{k}{2}\right\rfloor\)-th number of array \(nums1\) cannot be the \(k\)-th smallest number, so we can exclude the interval \([i, i + \left\lfloor\frac{k}{2}\right\rfloor)\) of array \(nums1\), and recursively call \(f(i + \left\lfloor\frac{k}{2}\right\rfloor, j, k - \left\lfloor\frac{k}{2}\right\rfloor)\).
If \(x > y\), it means that the \(\left\lfloor\frac{k}{2}\right\rfloor\)-th number of array \(nums2\) cannot be the \(k\)-th smallest number, so we can exclude the interval \([j, j + \left\lfloor\frac{k}{2}\right\rfloor)\) of array \(nums2\), and recursively call \(f(i, j + \left\lfloor\frac{k}{2}\right\rfloor, k - \left\lfloor\frac{k}{2}\right\rfloor)\).
The time complexity is \(O(\log(m + n))\), and the space complexity is \(O(\log(m + n))\). Here, \(m\) and \(n\) are the lengths of arrays \(nums1\) and \(nums2\) respectively.