|
1 | 1 | from typing import List, Tuple, Set
|
2 | 2 |
|
| 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 | + |
3 | 41 | # threeSum3()
|
4 | 42 | # Time Complexity O(n ^ 2)
|
5 | 43 | # - when sorting by sorted function(TimSort) for each string it takes O(nlogn)
|
|
8 | 46 | # - when sorting takes O(1)
|
9 | 47 |
|
10 | 48 |
|
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, ...]]: |
59 | 51 |
|
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) |
62 | 104 |
|
63 | 105 |
|
64 |
| - solution = Solution() |
65 |
| - solution.threeSum3(nums) |
|
0 commit comments