File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments