Skip to content

Commit 7a471ae

Browse files
committed
feat: implement threeSum function to find all unique triplets that sum to zero
1 parent 51ad997 commit 7a471ae

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

3sum/kangdaia.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution:
2+
def threeSum(self, nums: list[int]) -> list[list[int]]:
3+
"""
4+
nums에서 세 숫자를 골라 합이 0이 되는 조합을 구하는 함수
5+
세 숫자는 서로 다른 인덱스에 위치해야 함. 중복된 조합은 포함하지 않아야 함.
6+
7+
방법
8+
1. brute force. 세 숫자를 모두 조합하여 합이 0이 되는지 확인. O(n^3) 시간복잡도 -> 너무 오래 걸림!
9+
2. 첫번째 값을 고정하고 나머지 두개의 합을 two sum 문제에서 해결한 것 처럼 dict에 저장하여 찾기. O(n^2) 시간복잡도, O(n) 공간복잡도
10+
-> 중복된 조합을 걸러내는 과정이 필요함
11+
3. 정렬을 해서, 첫번째 값을 고정하고, 나머지 두개의 합이 첫번째 값의 음수가 되는 경우를 찾음 - 포인터 방식.
12+
-> O(n^2) 시간복잡도, O(1) 공간복잡도. 2번 방법보다 정렬을 하지 않으니 효율적
13+
4. 3번 방법에 시간을 줄일 수 있는 예외 케이스 혹은 조건을 찾아 빠르게 종료하기
14+
- 첫번째 값이 양수인 경우, 나머지 두개의 합이 음수가 될 수 없으므로 종료
15+
- 첫번째 값이 이전 값과 같은 경우, 중복된 조합이 되니 건너뛰기
16+
- append 값을 찾은 후에 j+1, k-1을 하면서 중복된 값이 아닐때까지 이동하기
17+
18+
Args:
19+
nums (list[int]): 정렬되지 않은 정수목록
20+
21+
Returns:
22+
list[list[int]]: 합이 0이 되는 세 숫자의 조합 목록
23+
"""
24+
answer = []
25+
s_nums = sorted(nums)
26+
n = len(s_nums)
27+
for i in range(n - 2):
28+
x = s_nums[i]
29+
if i > 0 and x == s_nums[i - 1]:
30+
continue
31+
if x > 0:
32+
break
33+
j, k = i + 1, n - 1
34+
while j < k:
35+
y, z = s_nums[j], s_nums[k]
36+
total = x + y + z
37+
if total == 0:
38+
answer.append([x, y, z])
39+
j += 1
40+
k -= 1
41+
while j < k and s_nums[j] == s_nums[j - 1]:
42+
j += 1
43+
while j < k and s_nums[k] == s_nums[k + 1]:
44+
k -= 1
45+
elif total < 0:
46+
j += 1
47+
else:
48+
k -= 1
49+
return answer

0 commit comments

Comments
 (0)