mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-13 03:27:07 +00:00
Time: 1083 ms (14.78%), Space: 22.4 MB (5.02%) - LeetHub
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
class Solution:
|
||||
def threeSum(self, nums: List[int]) -> List[List[int]]:
|
||||
# store frequency counts O(n)
|
||||
frequencies = {}
|
||||
for num in nums:
|
||||
frequencies[num] = frequencies.get(num, 0) + 1
|
||||
|
||||
|
||||
# find all pairs O(n^2)
|
||||
tripleSet = set()
|
||||
|
||||
def addTriple(x,y,z): # O(1) *sort always on 3 items
|
||||
triple = [x, y, z]
|
||||
triple.sort()
|
||||
tripleSet.add(tuple(triple))
|
||||
|
||||
freq_keys = list(frequencies.keys())
|
||||
for i in range(len(freq_keys)):
|
||||
for j in range(i, len(freq_keys)):
|
||||
if i == j and frequencies[freq_keys[i]] < 2:
|
||||
continue
|
||||
|
||||
pair = [freq_keys[i], freq_keys[j]]
|
||||
needed = -(pair[0] + pair[1])
|
||||
|
||||
# - check for third in frequency counts O(1)
|
||||
if frequencies.get(needed, -1) == -1:
|
||||
# no triple for given pair
|
||||
continue
|
||||
elif needed == pair[0] or needed == pair[1]:
|
||||
if pair[0] == pair[1]:
|
||||
if frequencies[needed] > 2:
|
||||
addTriple(pair[0], pair[1], needed)
|
||||
elif frequencies[needed] > 1:
|
||||
addTriple(pair[0], pair[1], needed)
|
||||
else:
|
||||
addTriple(pair[0], pair[1], needed)
|
||||
|
||||
|
||||
return list(map(lambda tup: list(tup), tripleSet))
|
||||
|
||||
"""
|
||||
O(n^3) *too slow
|
||||
triples = set()
|
||||
for i in range(len(nums)):
|
||||
for j in range(i + 1, len(nums)):
|
||||
for k in range(j + 1, len(nums)):
|
||||
if nums[i] + nums[j] + nums[k] == 0:
|
||||
t = [nums[i], nums[j], nums[k]]
|
||||
t.sort()
|
||||
triples.add(tuple(t))
|
||||
|
||||
return list(map(lambda tup: list(tup), triples))
|
||||
"""
|
||||
Reference in New Issue
Block a user