File tree 1 file changed +60
-0
lines changed
1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change
1
+ /*
2
+ 풀이 :
3
+ nums 배열을 정렬시킨 후 반복되는 값을 건너뛰며 두 포인터 기법을 사용한다
4
+ i포인터와 left, right 포인터의 값의 합이 0보다 작으면 left++, 크면 right--
5
+ 0이면 ans에 저장하고 left++, right--하는 로직을 left < right인 동안 반복한다
6
+
7
+ nums의 길이 N
8
+
9
+ TC : O(N^2)
10
+ 외부 반복문 N * 내부 반복문 N
11
+
12
+ SC : O(1) (ans 제외)
13
+ left, right, threeSum 3개의 변수만 사용한다
14
+ */
15
+
16
+ #include < vector>
17
+ #include < algorithm>
18
+ using namespace std ;
19
+
20
+ class Solution {
21
+ public:
22
+ vector<vector<int >> threeSum (vector<int >& nums) {
23
+ vector<vector<int >> ans;
24
+ int left;
25
+ int right;
26
+ int threeSum;
27
+
28
+ sort (nums.begin (), nums.end ());
29
+ for (int i = 0 ; i < nums.size () - 2 ; i++)
30
+ {
31
+ // i포인터 중복 제거
32
+ if (i > 0 && nums[i] == nums[i - 1 ])
33
+ continue ;
34
+
35
+ left = i + 1 ;
36
+ right = nums.size () - 1 ;
37
+ while (left < right)
38
+ {
39
+ threeSum = nums[i] + nums[left] + nums[right];
40
+ if (threeSum < 0 )
41
+ left++;
42
+ else if (threeSum > 0 )
43
+ right--;
44
+ else
45
+ {
46
+ ans.push_back ({nums[i], nums[left], nums[right]});
47
+ // left포인터 중복 제거
48
+ while (left < right && nums[left] == nums[left + 1 ])
49
+ left++;
50
+ // right 포인터 중복 제거
51
+ while (left < right && nums[right] == nums[right - 1 ])
52
+ right--;
53
+ left++;
54
+ right--;
55
+ }
56
+ }
57
+ }
58
+ return ans;
59
+ }
60
+ };
You can’t perform that action at this time.
0 commit comments