---
tags: LeetCode,Top 100 Liked Questions
---
# 15. 3Sum
https://leetcode.com/problems/3sum/
## 題目敘述
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain duplicate triplets.
## Example
Example 1:
```
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
```
Example 2:
```
Input: nums = []
Output: []
```
Example 3:
```
Input: nums = [0]
Output: []
```
## 解題想法
### 1.暴力破解(利用set)
利用set中元素不重複特性達成i != j, i != k, and j != k
```
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
set<vector<int>> hashSet;
sort(nums.begin(), nums.end());
if(nums.size()>=3){
for(int i=0; i<nums.size()-2; i++)
for(int j=i+1; j<nums.size()-1; j++)
for(int k=j+1; k<nums.size(); k++){
if(nums[i] + nums[j] + nums[k] == 0){
hashSet.insert({nums[i], nums[j], nums[k]});
}
}
}
res.assign(hashSet.begin(), hashSet.end());
return res;
}
};
```
時間複雜度為O(N^3)
會在315 test case TLE
### 2.
利用2個pointer紀錄排序後的left,right(頭尾)
並在紀錄後跳過重複項
```
vector<vector<int>> threeSum(vector<int> &nums)
{
vector<vector<int>> ans;
int n = nums.size();
if (n < 3)
{
return {};
}
sort(nums.begin(), nums.end());
for (int i = 0; i < n; i++)
{
int first = nums[i];
int l = i + 1, r = n - 1;
while (l < r)
{
int second = nums[l], third = nums[r];
if ((first + second + third) == 0)
{
ans.push_back({first, second, third});
while (l <= r && second == nums[l])
{
l++;
}
while (l <= r && third == nums[r])
{
r--;
}
}
else if ((first + second + third) > 0)
{
r--;
}
else
{
l++;
}
}
while (i < n-2 && nums[i] == nums[i + 1])
{
i++;
}
}
return ans;
}
```
時間複雜度為O(N^2)