Skip to content

Commit c6a6081

Browse files
Add solution for finding median of two sorted arrays
This commit introduces an implementation of the algorithm to find the median of two sorted arrays using binary search. The solution ensures optimal time complexity and includes comprehensive unit tests for various edge cases.
1 parent c2d7e46 commit c6a6081

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# https://neetcode.io/problems/median-of-two-sorted-arrays
2+
3+
import unittest
4+
from typing import List
5+
6+
7+
def find_median_sorted_arrays(nums1: List[int], nums2: List[int]) -> float:
8+
A, B = nums1, nums2
9+
10+
if len(B) < len(A):
11+
(
12+
A,
13+
B,
14+
) = (
15+
B,
16+
A,
17+
)
18+
19+
total = len(A) + len(B)
20+
half = total // 2
21+
22+
left = 0
23+
right = len(A) - 1
24+
25+
while True:
26+
i = (left + right) // 2 # A
27+
j = half - i - 2 # B
28+
29+
a_left = A[i] if i >= 0 else float("-inf")
30+
a_right = A[i + 1] if i + 1 < len(A) else float("inf")
31+
32+
b_left = B[j] if j >= 0 else float("-inf")
33+
b_right = B[j + 1] if j + 1 < len(B) else float("inf")
34+
35+
# Did we find the correct partition?
36+
if a_left <= b_right and b_left <= a_right:
37+
# partition is of odd length
38+
if total % 2 == 1:
39+
return min(a_right, b_right)
40+
41+
# partition is of even length
42+
return (max(a_left, b_left) + min(a_right, b_right)) / 2
43+
44+
if a_left > b_right:
45+
right = i - 1
46+
else:
47+
left = i + 1
48+
49+
50+
class TestFindMedianSortedArrays(unittest.TestCase):
51+
def test_basic_case(self):
52+
nums1 = [1, 3]
53+
nums2 = [2]
54+
expected_result = 2.0
55+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
56+
57+
def test_even_total_length(self):
58+
nums1 = [1, 2]
59+
nums2 = [3, 4]
60+
expected_result = 2.5
61+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
62+
63+
def test_one_empty_array(self):
64+
nums1 = []
65+
nums2 = [1]
66+
expected_result = 1.0
67+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
68+
69+
nums1 = [2]
70+
nums2 = []
71+
expected_result = 2.0
72+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
73+
74+
def test_single_element_each(self):
75+
nums1 = [1]
76+
nums2 = [2]
77+
expected_result = 1.5
78+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
79+
80+
def test_large_unequal_arrays(self):
81+
nums1 = [1, 2, 3]
82+
nums2 = [4, 5, 6, 7]
83+
expected_result = 4.0
84+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
85+
86+
def test_identical_elements(self):
87+
nums1 = [2, 2, 2]
88+
nums2 = [2, 2]
89+
expected_result = 2.0
90+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)
91+
92+
def test_one_large_one_small(self):
93+
nums1 = [1, 2]
94+
nums2 = [3]
95+
expected_result = 2.0
96+
self.assertEqual(find_median_sorted_arrays(nums1, nums2), expected_result)

0 commit comments

Comments
 (0)