Coverage for blog/dsa/leetcode/median_two_sorted_arrays/__init__.py: 62%
81 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:23 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:23 +0000
1import pytest
4# start snippet solution_initial
5class Solution:
7 # NOTE: Input arrays should already be sorted.
8 def findMedianSortedArrays(
9 self,
10 nums1: list[int],
11 nums2: list[int],
12 ) -> float:
14 n1, n2 = len(nums1), len(nums2)
15 if n1 + n2 == 1:
16 if n1 != 0:
17 return nums1[0]
18 else:
19 return nums2[0]
21 start_1, start_2 = 0, 0
22 stop_1, stop_2 = n1 - 1, n2 - 1
23 left, right = None, None
25 while True:
26 # If both, decide which one to decrement/increment
27 if start_1 <= stop_1 and start_2 <= stop_2:
28 a, b = nums1[start_1], nums2[start_2]
29 if a <= b:
30 left = a
31 start_1 += 1
32 else:
33 left = b
34 start_2 += 1
36 a, b = nums1[stop_1], nums2[stop_2]
37 if a >= b:
38 right = a
39 stop_1 -= 1
40 else:
41 right = b
42 stop_2 -= 1
43 elif start_1 < stop_1:
44 left = nums1[start_1]
45 right = nums1[stop_1]
47 stop_1 -= 1
48 start_1 += 1
49 elif start_2 < stop_2:
50 left = nums2[start_2]
51 right = nums2[stop_2]
53 stop_2 -= 1
54 start_2 += 1
55 elif stop_1 == start_1:
56 left = right = nums1[stop_1]
57 break
58 elif stop_2 == start_2:
59 left = right = nums2[stop_2]
60 break
61 else:
62 break
64 return (left + right) / 2 # type: ignore[operator]
67# end snippet solution_initial
70# start snippet solution_2
71class Solution2:
73 def findMedianSortedArrays(
74 self,
75 nums1: list[int],
76 nums2: list[int],
77 ) -> float:
79 n1, n2 = len(nums1), len(nums2)
80 start_1, start_2 = 0, 0
81 stop_1, stop_2 = n1 - 1, n2 - 1
82 left, right = None, None
84 while True:
85 # If both, decide which one to decrement/increment
86 if start_1 <= stop_1 and start_2 <= stop_2:
87 a, b = nums1[start_1], nums2[start_2]
88 if a <= b:
89 left = a
90 start_1 += 1
91 else:
92 left = b
93 start_2 += 1
95 a, b = nums1[stop_1], nums2[stop_2]
96 if a >= b:
97 right = a
98 stop_1 -= 1
99 else:
100 right = b
101 stop_2 -= 1
103 # If one remains, find its median
104 elif start_1 <= stop_1:
105 left = nums1[start_1]
106 right = nums1[stop_1]
108 stop_1 -= 1
109 start_1 += 1
110 elif start_2 <= stop_2:
111 left = nums2[start_2]
112 right = nums2[stop_2]
114 stop_2 -= 1
115 start_2 += 1
116 else:
117 break
119 return (left + right) / 2 # type: ignore[operator]
122# end snippet solution_2
125@pytest.fixture
126def solution():
127 return Solution()
130# 1,2,3,
131# 4,5,6,
132# 7,8,9,
133# 10,11, 12,
134# 13,14,15,
135# 16,17
138@pytest.mark.parametrize(
139 "nums1, nums2, answer",
140 (
141 ([3], [-2, -1], -1),
142 ([1], [], 1),
143 ([1, 2, 3], [], 2),
144 ([1, 3], [2], 2.0),
145 ([1, 2], [3, 4], 2.5),
146 ([5, 6, 7, 8], [4, 9], 6.5),
147 ([1, 2, 5, 6], [3, 4], 3.5),
148 ([1, 2, 3, 7, 8, 9], [4, 5, 6], 5.0),
149 ([2, 2, 4, 4], [2, 2, 2, 4, 4], 2.0),
150 ([1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 9.0),
151 ),
152)
153def test_solution(
154 solution: Solution,
155 nums1: list[int],
156 nums2: list[int],
157 answer: float,
158):
159 assert solution.findMedianSortedArrays(nums1, nums2) == answer