diff --git a/0015-3sum/0015-3sum.py b/0015-3sum/0015-3sum.py new file mode 100644 index 0000000..df88aa1 --- /dev/null +++ b/0015-3sum/0015-3sum.py @@ -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)) + """ \ No newline at end of file