/
exercise1.py
75 lines (59 loc) · 1.88 KB
/
exercise1.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Name: MaxProductOhThree
# Link: https://codility.com/demo/take-sample-test/max_product_of_three/
def solution(A):
N = len(A)
maxs = [0]*3
mins = [1001]*2
if N == 3:
return A[0]*A[1]*A[2]
maxs[0] = max([A[0], A[1], A[2]])
# Prepares the maxs array
if maxs[0] == A[0]:
maxs[1] = max([A[1], A[2]])
if maxs[1] == A[1]:
maxs[2] = A[2]
else:
maxs[2] = A[1]
elif maxs[0] == A[1]:
maxs[1] = max([A[0], A[2]])
if maxs[1] == A[0]:
maxs[2] = A[2]
else:
maxs[2] = A[0]
else:
maxs[1] = max([A[0], A[1]])
if maxs[1] == A[0]:
maxs[2] = A[1]
else:
maxs[2] = A[0]
# Iterate to find the three maxs and two mins if it exists
# Shift maxs if A[k] is greter than any element of maxs
# maxs[2] could be a min.
for k in xrange(3, N):
if A[k] > maxs[0]:
switch(mins, maxs[2])
maxs[2] = maxs[1]
maxs[1] = maxs[0]
maxs[0] = A[k]
elif A[k] > maxs[1]:
switch(mins, maxs[2])
maxs[2] = maxs[1]
maxs[1] = A[k]
elif A[k] > maxs[2]:
switch(mins, maxs[2])
maxs[2] = A[k]
else:
switch(mins, A[k])
# If has only one minimum
if mins[1] == 1001:
# if maxs[2] < 0, mins[0]*maxs[2] > 0, and could be greater than maxs[1]*maxs[2]
return max(maxs[0]*maxs[1]*maxs[2], maxs[0]*maxs[2]*mins[0])
# If mins < 0, mins[0]*mins[1] > 0 and could be greater than maxs[1]*maxs[2]
return max(maxs[0]*maxs[1]*maxs[2], maxs[0]*mins[0]*mins[1])
# Shift mins if n is lesser than any elements of mins
def switch(mins, n):
if n < mins[0]:
mins[1] = mins[0]
mins[0] = n
elif n < mins[1]:
mins[1] = n