LeetCode 0004. Median of Two Sorted Arrays Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0

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

Solutions

Solution 1: Divide and Conquer

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\lfloorm + n + 12\right\rfloor-th number; if m + n is even, then the median is the average of the \left\lfloorm + n + 12\right\rfloor-th and the \left\lfloorm + n + 22\right\rfloor-th numbers. In fact, we can unify it as the average of the \left\lfloorm + n + 12\right\rfloor-th and the \left\lfloorm + n + 22\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\lfloorm + n + 12\right\rfloor) and f(0, 0, \left\lfloorm + n + 22\right\rfloor).

The implementation idea of the function f(i, j, k) is as follows:

  • If i ≥ m, it means that the interval [i, m) of array nums1 is empty, so directly return nums2[j + k - 1];
  • If j ≥ 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\lfloork2\right\rfloor-th number in the two arrays, denoted as x and y. (Note, if a certain array does not have the \left\lfloork2\right\rfloor-th number, then we regard the \left\lfloork2\right\rfloor-th number as +∞.) Compare the size of x and y:
    • If x ≤ y, it means that the \left\lfloork2\right\rfloor-th number of array nums1 cannot be the k-th smallest number, so we can exclude the interval [i, i + \left\lfloork2\right\rfloor) of array nums1, and recursively call f(i + \left\lfloork2\right\rfloor, j, k - \left\lfloork2\right\rfloor).
    • If x > y, it means that the \left\lfloork2\right\rfloor-th number of array nums2 cannot be the k-th smallest number, so we can exclude the interval [j, j + \left\lfloork2\right\rfloor) of array nums2, and recursively call f(i, j + \left\lfloork2\right\rfloor, k - \left\lfloork2\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.

PythonJavaC++GoTypeScriptJavaScriptC#PHPNimC
class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: def f(i: int, j: int, k: int) -> int: if i >= m: return nums2[j + k - 1] if j >= n: return nums1[i + k - 1] if k == 1: return min(nums1[i], nums2[j]) p = k // 2 x = nums1[i + p - 1] if i + p - 1 < m else inf y = nums2[j + p - 1] if j + p - 1 < n else inf return f(i + p, j, k - p) if x < y else f(i, j + p, k - p) m, n = len(nums1), len(nums2) a = f(0, 0, (m + n + 1) // 2) b = f(0, 0, (m + n + 2) // 2) return (a + b) / 2(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !