File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Expand file tree Collapse file tree 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