Skip to content

Commit 3b67b3b

Browse files
committed
add 3sum
1 parent 696c978 commit 3b67b3b

File tree

1 file changed

+92
-52
lines changed

1 file changed

+92
-52
lines changed

3sum/rivkode.py

Lines changed: 92 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,43 @@
11
from typing import List, Tuple, Set
22

3+
class Solution(object):
4+
def threeSum(self, nums):
5+
result = set()
6+
v_set = {}
7+
8+
for i, v in enumerate(nums):
9+
v_set[v] = i
10+
11+
n = len(nums)
12+
for i in range(n):
13+
for j in range(i + 1, n):
14+
v = nums[i]
15+
w = nums[j]
16+
target = -(v + w)
17+
if target in v_set:
18+
k = v_set[target]
19+
if k != i and k != j:
20+
triplet = tuple(sorted([v, w, target]))
21+
result.add(triplet)
22+
23+
return list(result)
24+
25+
if __name__ == "__main__":
26+
solution = Solution()
27+
nums = [-1,0,1,2,-1,-4]
28+
result = solution.threeSum(nums)
29+
print(result)
30+
31+
32+
33+
34+
35+
36+
37+
38+
39+
# previous version
40+
341
# threeSum3()
442
# Time Complexity O(n ^ 2)
543
# - when sorting by sorted function(TimSort) for each string it takes O(nlogn)
@@ -8,58 +46,60 @@
846
# - when sorting takes O(1)
947

1048

11-
class Solution:
12-
def threeSum(self, nums: List[int]) -> list[tuple[int, ...]]:
13-
14-
triplets = set()
15-
for i in range(len(nums) - 2):
16-
for j in range(i + 1, len(nums)):
17-
for k in range(j + 1, len(nums)):
18-
if nums[i] + nums[j] + nums[k] == 0:
19-
triplet = [nums[i], nums[j], nums[k]]
20-
triplets.add(tuple(sorted(triplet)))
21-
22-
return list(triplets)
23-
24-
def threeSum2(self, nums: List[int]) -> list[tuple[int, ...]]:
25-
triplets = set()
26-
27-
for i in range(len(nums)):
28-
seen = set()
29-
for j in range(i + 1, len(nums)):
30-
res = -(nums[i] + nums[j])
31-
if res in seen:
32-
triplet = [nums[i], nums[j], res]
33-
triplets.add(tuple(sorted(triplet)))
34-
seen.add(nums[j])
35-
36-
return list(triplets)
37-
38-
def threeSum3(self, nums: List[int]) -> list(tuple[int, ...]):
39-
triplets = set()
40-
nums.sort()
41-
42-
for i in range(len(nums) - 2):
43-
l = i + 1
44-
r = len(nums) - 1
45-
46-
while l < r:
47-
res = nums[l] + nums[r] + nums[i]
48-
if res > 0:
49-
r -= 1
50-
elif res < 0:
51-
l += 1
52-
elif res == 0:
53-
triple = (nums[l], nums[r], nums[i])
54-
triplets.add(triple)
55-
l, r = l + 1, r - 1
56-
else:
57-
raise Exception
58-
return list(triplets)
49+
# class Solution:
50+
# def threeSum(self, nums: List[int]) -> list[tuple[int, ...]]:
5951

60-
if __name__ == "__main__":
61-
nums = [-1,0,1,2,-1,-4]
52+
# triplets = set()
53+
# for i in range(len(nums) - 2):
54+
# for j in range(i + 1, len(nums)):
55+
# for k in range(j + 1, len(nums)):
56+
# if nums[i] + nums[j] + nums[k] == 0:
57+
# triplet = [nums[i], nums[j], nums[k]]
58+
# triplets.add(tuple(sorted(triplet)))
59+
60+
# return list(triplets)
61+
62+
# def threeSum2(self, nums: List[int]) -> list[tuple[int, ...]]:
63+
# triplets = set()
64+
65+
# for i in range(len(nums)):
66+
# seen = set()
67+
# for j in range(i + 1, len(nums)):
68+
# res = -(nums[i] + nums[j])
69+
# if res in seen:
70+
# triplet = [nums[i], nums[j], res]
71+
# triplets.add(tuple(sorted(triplet)))
72+
# seen.add(nums[j])
73+
74+
# return list(triplets)
75+
76+
# def threeSum3(self, nums: List[int]) -> list(tuple[int, ...]):
77+
# triplets = set()
78+
# nums.sort()
79+
80+
# for i in range(len(nums) - 2):
81+
# l = i + 1
82+
# r = len(nums) - 1
83+
84+
# while l < r:
85+
# res = nums[l] + nums[r] + nums[i]
86+
# if res > 0:
87+
# r -= 1
88+
# elif res < 0:
89+
# l += 1
90+
# elif res == 0:
91+
# triple = (nums[l], nums[r], nums[i])
92+
# triplets.add(triple)
93+
# l, r = l + 1, r - 1
94+
# else:
95+
# raise Exception
96+
# return list(triplets)
97+
98+
# if __name__ == "__main__":
99+
# nums = [-1,0,1,2,-1,-4]
100+
101+
102+
# solution = Solution()
103+
# solution.threeSum3(nums)
62104

63105

64-
solution = Solution()
65-
solution.threeSum3(nums)

0 commit comments

Comments
 (0)