File tree 1 file changed +52
-0
lines changed
1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * 세 수의 합이 0이 되는 모든 고유한 조합을 찾는 함수
3
+ *
4
+ * @param {number[] } nums - 정수 배열
5
+ * @returns {number[][] } - 세 수의 합이 0이 되는 조합 배열
6
+ *
7
+ * 1. 입력 배열 `nums`를 오름차순으로 정렬.
8
+ * 2. 이중 반복문을 사용하여 각 요소를 기준으로 `투 포인터(two-pointer)`를 이용해 조합을 탐색.
9
+ * 3. 중복 조합을 방지하기 위해 `Set`을 사용하여 결과 조합의 문자열을 저장.
10
+ * 4. 조건에 맞는 조합을 `result` 배열에 추가합니다.
11
+ *
12
+ * 시간 복잡도:
13
+ * - 정렬: O(n log n)
14
+ * - 이중 반복문 및 투 포인터: O(n^2)
15
+ * - 전체 시간 복잡도: O(n^2)
16
+ *
17
+ * 공간 복잡도:
18
+ * - `Set` 및 `result` 배열에 저장되는 고유 조합: O(k), k는 고유한 조합의 수
19
+ * - 전체 공간 복잡도: O(n + k)
20
+ */
21
+ function threeSum ( nums : number [ ] ) : number [ ] [ ] {
22
+ const sumSet = new Set < string > ( ) ;
23
+ const result : number [ ] [ ] = [ ] ;
24
+ nums . sort ( ( a , b ) => a - b ) ;
25
+
26
+ // 첫 번째 요소를 기준으로 반복문 수행
27
+ for ( let i = 0 ; i < nums . length - 2 ; i ++ ) {
28
+ // 정렬 된 상태이기 때문에 시작점을 기준으로 다음 값 중복 비교
29
+ if ( i > 0 && nums [ i ] === nums [ i - 1 ] ) continue ;
30
+
31
+ let start = i + 1 , end = nums . length - 1 ;
32
+ while ( start < end ) {
33
+ const sum = nums [ i ] + nums [ start ] + nums [ end ] ;
34
+ if ( sum > 0 ) {
35
+ end -- ;
36
+ } else if ( sum < 0 ) {
37
+ start ++ ;
38
+ } else {
39
+ const triplet = [ nums [ i ] , nums [ start ] , nums [ end ] ] ;
40
+ const key = triplet . toString ( ) ;
41
+ if ( ! sumSet . has ( key ) ) {
42
+ sumSet . add ( key ) ;
43
+ result . push ( triplet ) ;
44
+ }
45
+ start ++ ;
46
+ end -- ;
47
+ }
48
+ }
49
+ }
50
+
51
+ return result ;
52
+ }
You can’t perform that action at this time.
0 commit comments