1+ // ํฌํฌ์ธํฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ธฐ๋ณธ ์๊ฐ๋ณต์ก๋๊ฐ O(2^n)์ด๋ฏ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ O(NlogN)์ ๋ง์๊ป ์ฌ์ฉํด๋ ๋๋ค.
2+ public List <List <Integer >> threeSum (int [] nums ) {
3+ List <List <Integer >> result = new ArrayList <>();
4+ Arrays .sort (nums );
5+ for (int i =0 ; i < nums .length -2 ;i ++) {
6+ if (i > 0 && nums [i ] == nums [i - 1 ]) continue ;
7+ int left = i + 1 , right = nums .length - 1 ;
8+ while (left < right ) {
9+ int sum = nums [i ] + nums [left ] + nums [right ];
10+
11+ if (sum == 0 ) {
12+ result .add (Arrays .asList (nums [i ], nums [left ], nums [right ]));
13+
14+ while (left < right && nums [left ] == nums [left + 1 ]) left ++;
15+ while (left < right && nums [right ] == nums [right - 1 ]) right --;
16+
17+ left ++;
18+ right --;
19+ } else if (sum < 0 ) {
20+ left ++;
21+ } else {
22+ right --;
23+ }
24+ }
25+ }
26+ return result ;
27+ }
28+
29+
30+ // dfs ํ์ด๋ฅผ ์๊ฐํ์ผ๋ dfs ๋ฐฉ์์ ๋ฌด์กฐ๊ฑด O(2^n)์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
31+ // ํ์ ์์ ์ค๋ต
32+ public class Solution {
33+ public List <List <Integer >> threeSum (int [] nums ) {
34+ Set <List <Integer >> answerSet = new HashSet <>();
35+ nums = Arrays .stream (nums ).sorted ().toArray ();
36+ dfs (nums , 0 , new ArrayList <>(), answerSet );
37+ return new ArrayList <>(answerSet );
38+ }
39+
40+ public void dfs (int [] nums , int index , List <Integer > temp , Set <List <Integer >> answerSet ) {
41+ if (temp .size () == 3 ) {
42+ int result = 0 ;
43+ for (int element : temp ) result += element ;
44+ if (result == 0 ) answerSet .add (new ArrayList <>(temp ));
45+ return ;
46+ }
47+
48+ for (int i = index ; i < nums .length ; i ++) {
49+ temp .add (nums [i ]);
50+ dfs (nums , i + 1 , temp , answerSet );
51+ temp .remove (temp .size () - 1 );
52+ }
53+ }
54+ }
0 commit comments