Skip to content

Commit d86d2af

Browse files
committed
feat: add "3Sum" solution
1 parent e537bec commit d86d2af

File tree

1 file changed

+106
-4
lines changed

1 file changed

+106
-4
lines changed

3sum/shinsj4653.py

Lines changed: 106 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,115 @@
11
"""
2-
Inputs:
2+
Inputs: 정수 배열 nums
33
4-
Outputs:
4+
Outputs: triplet 모음 배열 (중복 요소 X)
55
6-
Constraints:
6+
Constraints: 3 < = nums.length <= 3 * 10^3
7+
-10^5 <= nums[i] <= 10^5
78
89
Time Complexity:
910
10-
Space Complexity:
11+
각 수들의 위치 다르면서, 합이 0이 되는 조합들의 모음 결과
12+
n^3 은 안됨
1113
14+
하지만 가능한 모든 조합 구하기를 효율화 시키면 될듯?
15+
16+
x 0 1 2 3 4 5
17+
0 [_,-1,0,1,-2,-5]
18+
1 [_,_,1,2,-1,-4]
19+
2 [_,_,_,
20+
3
21+
4
22+
5
23+
24+
n^2
25+
26+
27+
28+
0 [1 2]
29+
0 [1 3]
30+
0 [1 4]
31+
0 [1 5]
32+
33+
0 1 [2 3]
34+
0 1 [2 4]
35+
0 1 [2 5]
36+
37+
0 1 2[3 4]
38+
0 1 2[3 5]
39+
40+
0 1 2 3 [4 5]
41+
42+
우선 대괄호 안 두 수 합 사전 만들고,
43+
keys() 순회하며,
44+
key = a, b -> a보다 작은 수 for문 돌며 합 구하기?
45+
-> 그럼 시간복잡도 : O(n^3 보다 살짝 작은??)
46+
47+
하지만 이 풀이로는 중복 후보가 나옴..
48+
49+
50+
Space Complexity: O(n^2)
51+
52+
대괄호 내 두 수 조합 만큼의 크기가 사전 크기
53+
54+
# 1차 제출 코드
55+
56+
from collections import defaultdict
57+
58+
class Solution:
59+
def threeSum(self, nums: List[int]) -> List[List[int]]:
60+
n = len(nums)
61+
v = defaultdict(int)
62+
ret = []
63+
memo = set()
64+
65+
for i in range(1, n):
66+
for j in range(i + 1, n):
67+
v[(i, j)] = nums[i] + nums[j]
68+
69+
print(v)
70+
for key in v.keys():
71+
a, b = key
72+
print('key: a, b', a, b)
73+
74+
for i in range(a):
75+
if nums[i] + v[key] == 0 and \
76+
not (nums[i] in memo and nums[a] in memo and nums[b] in memo):
77+
print('sum zero!')
78+
memo.add(nums[i])
79+
memo.add(nums[a])
80+
memo.add(nums[b])
81+
ret.append([nums[i], nums[a], nums[b]])
82+
83+
84+
85+
return ret
86+
87+
테스트 케이스만 정답..
88+
nums =
89+
[-1,0,1,2,-1,-4,-2,-3,3,0,4] 인 경우는 오답
90+
91+
[회고]
92+
완탐, dp로 해봐도 안 풀리면 투 포인터 생각해보기!
1293
"""
1394

95+
class Solution:
96+
def threeSum(self, nums: List[int]) -> List[List[int]]:
97+
tuples = set()
98+
nums.sort()
99+
100+
for i in range(len(nums) - 2):
101+
left, right = i + 1, len(nums) - 1
102+
103+
while left < right:
104+
three_sum = nums[i] + nums[left] + nums[right]
105+
if three_sum < 0:
106+
left += 1
107+
elif three_sum > 0:
108+
right -= 1
109+
else :
110+
tuples.add((nums[i], nums[left], nums[right]))
111+
left += 1
112+
right -= 1
113+
114+
return list(tuples)
115+

0 commit comments

Comments
 (0)