# 【LeetCode】 15. 3Sum
## Description
> Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
> **Note**:
> The solution set must not contain duplicate triplets.
> 給一包含n個整數的陣列nums,有任意三個元素a, b, c能夠使a + b + c = 0 成立嗎?找到所有陣列中的三個數,相加總和為零。
> 提示:答案中不可有重複的組合。
## Example:
```
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
```
## Solution
* 請先看完[1. Two Sum](https://hackmd.io/s/ryMr477o4)。
* 這題變為三個數字總和為零,那只要用loop將其中一個數字設為目標數跑過一輪即可。
* 為了加速,將數列先排列,然後根據總和太大或太小往中間慢慢靠近。
* 為了排除重複的組合,答案換為set再換回去(感覺有更好的做法,這樣做好像有點慢)。
### Code
```C++=1
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
if (nums.empty())
return ans;
sort(nums.begin(),nums.end());
unordered_set<int> seen;
int s = nums.size();
for (int i = 0; i < s - 2; i++)
{
if (seen.find(nums[i]) != seen.end())
continue;
int target = -nums[i];
int b = i + 1, e = s - 1;
while (b < e)
{
if (nums[b] + nums[e] == target)
{
ans.push_back({nums[b], nums[i], nums[e]});
b++;
e--;
}
else if (nums[b] + nums[e] > target)
e--;
else
b++;
}
seen.insert(nums[i]);
}
set<vector<int>> u(ans.begin(),ans.end());
ans.assign(u.begin(),u.end());
return ans;
}
};
```
###### tags: `LeetCode` `C++`