-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathp17_19.py
53 lines (36 loc) · 1.28 KB
/
p17_19.py
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
from typing import List
import math
import copy
import random
# Method: Use math
# Time: O(n)
# Space: O(1)
# Note: For 2 numbers, we can get a + b and a^2 + b^2
# (a + b) ^ 2 = a^2 + 2ab + b^2
TRIALS = 10
def find_two_missing(arr: List[int], N: int) -> List[int]:
# print(f"Array of len {len(arr)} is {arr}")
all_sum = sum(range(1, N + 1))
all_quad_sum = sum(i ** 2 for i in range(1, N + 1))
real_sum = sum(arr)
real_quad_sum = sum(x ** 2 for x in arr)
delta_sum = all_sum - real_sum
delta_quad_sum = all_quad_sum - real_quad_sum
b = int((delta_sum + math.sqrt(2 * delta_quad_sum - delta_sum ** 2)) / 2)
a = int((delta_sum ** 2 - delta_quad_sum) / (2 * b))
return [a, b]
def get_indexes_to_remove(N: int) -> tuple:
a = random.randint(0, N - 1)
b = random.randint(0, N - 1)
while b == a:
b = random.randint(0, N - 1)
return (a, b)
if __name__ == "__main__":
N = 100
all_arr = list(range(1, N + 1))
for i in range(TRIALS):
test_arr = copy.copy(all_arr)
i1, i2 = get_indexes_to_remove(N)
a, b = test_arr[i1], test_arr[i2]
test_arr = [test_arr[i] for i in range(len(test_arr)) if i not in {i1, i2}]
print(f"Missing from arr are {find_two_missing(test_arr,N)}, expected {a}, {b}")