-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTwoSum.py
More file actions
72 lines (60 loc) · 2.82 KB
/
Copy pathTwoSum.py
File metadata and controls
72 lines (60 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pytest
class Solution:
def brute_force(self, numbers, target): # numbers = [4, 8, 12, 13, 15, 18, 22] & 7 elements, target = 28
for i in range(len(numbers) - 1): # i = 0,1,2,3,4,5,6
# for j in range(i+1): # it is a mistake because the end point is i so j stop till i only so we have to mention that start,end point in range
for j in range(i + 1, len(numbers)): # j = 1,2,3,4,5,6,7
# print(f"i = {i}, j = {j}, {numbers[i]} + {numbers[j]} = {numbers[i] + numbers[j]}")
if numbers[i] + numbers[j] == target:
return [i + 1, j + 1]
def twosum(self, numbers, target):
left = 0
right = len(numbers) - 1
while left < right:
total = numbers[left] + numbers[right]
if total == target:
return [left + 1, right + 1]
elif total > target:
right -= 1
else:
left += 1
problem = Solution()
# ====================== TEST CASES (FIXED) ======================
test_data = [
{"numbers": [2, 7, 11, 15], "target": 9, "expected": [1, 2]},
{"numbers": [1, 3, 5, 7, 9], "target": 16, "expected": [4, 5]}, # 7 + 9
{"numbers": [1, 4, 6, 8, 10], "target": 14, "expected": [2, 5]}, # 4 + 10
{"numbers": [-10, -3, 0, 5, 9], "target": 6, "expected": [2, 5]}, # -3 + 9
{"numbers": [-8, -5, -3, -1], "target": -9, "expected": [1, 4]}, # -8 + -1
{"numbers": [1, 2, 2, 3, 4], "target": 4, "expected": [1, 4]}, # 1 + 3
{"numbers": [1, 2], "target": 3, "expected": [1, 2]},
{"numbers": [1, 5, 20, 35, 100], "target": 120, "expected": [3, 5]}, # 20 + 100
{"numbers": [1, 2, 3, 4], "target": 20, "expected": None}, # No solution
{"numbers": [0, 2, 4, 6, 8], "target": 8, "expected": [1, 5]}, # 0 + 8
{"numbers": [3, 3, 4, 5], "target": 6, "expected": [1, 2]}, # 3 + 3
{"numbers": [4, 8, 12, 13, 15, 18, 22], "target": 40, "expected": [6, 7]}, # 18 + 22
]
for idx, test in enumerate(test_data, start=1):
numbers = test["numbers"]
target = test["target"]
print(f"\nTest Case {idx}")
print(f"numbers = {numbers}")
print(f"target = {target}")
print("Brute Force:", problem.brute_force(numbers, target))
print("Two Pointer:", problem.twosum(numbers, target))
@pytest.mark.parametrize(
"numbers, target, expected",
[(t["numbers"], t["target"], t["expected"]) for t in test_data],
)
def test_twosum_brute_force(numbers, target, expected):
sol = Solution()
result = sol.brute_force(numbers, target)
assert result == expected
@pytest.mark.parametrize(
"numbers, target, expected",
[(t["numbers"], t["target"], t["expected"]) for t in test_data],
)
def test_twosum_twosum(numbers, target, expected):
sol = Solution()
result = sol.twosum(numbers, target)
assert result == expected