Skip to content

Commit 9a1aa25

Browse files
committed
#241 3sum solution
1 parent c4240c8 commit 9a1aa25

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

3sum/sungjinwi.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
};

0 commit comments

Comments
 (0)