Description
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
Code
Brute Force
Time Complexity: O(nlogn), Space Complexity: O(n)
Heap
Time Complexity: O(klogn), Space Complexity: O(n)
Binary Search
Time Complexity: O(log(min(m+n))), Space Complexity: O(n)
對於一個長度為 n 的 array 來說,有 2n + 1 個 cut position,以 [1, 2, 3]
來說,相當於 [*, 1, *, 2, *, 3, *]
總共 7 個 cut position。
而 cut position mapping 到原本 array element 的方式如下表:
N Index of L / R
1 0 / 0
2 0 / 1
3 1 / 1
4 1 / 2
5 2 / 2
6 2 / 3
7 3 / 3
8 3 / 4
L 一定會是 (N - 1) / 2,而 R 一定會是 N / 2。以[*, 1, *, 2, *, 3, *]
為例,當選擇 index 3 為 cut position 時,對應到的 L 會是 (3 - 1) / 2 = 1,為原本 [1, 2, 3]
的 index 1 的元素,就是 2。而 R 對應到的會是 N / 2 = 3 / 2 = 1,也是 element 2。
因為我們把 cut position 考慮進去,因此每個 length = N 的 array 都會變成 length = 2N + 1。
我們會先選擇長度較長的去做 cut,因為選短的沒有意義(長的還有一大堆,短的再怎麼樣 cut 都不會幫助我們更快找到 median)。
令長的為 N2,短的為 N1(原本長度),則加上 cut position 後長度分別為 2N2+1 和 2N1+1。在長的中選擇一個 cut position(用 binary search),令為 k,將兩個 array 都一起考慮,總共有 2N1+2N2+2 個 cut position,一半是 N1+N2+1 個 cut position,用 0-based index 來看的話(k 也是 0-based index),還剩下 (N1+N2+1)−1−k 個 cut position,也就是短的 array 中我們要選擇的 cut position。
INT_MIN & INT_MAX
對應到的是 cut 在 index 0 和尾端的 edge case。
Source