地址:https://leetcode.com/problems/3sum/
题目:
Given an array nums
of n integers, are there elements
a
,
b
,
c
a, b, c
a,b,c in nums such that
a
+
b
+
c
=
0
a + b + c = 0
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.
Example:
理解:
想到的方法就是固定一个,把3-sum变成了2-sum。
看了看别人的实现,首先拍了一下序,这样可以避免重复的结果。然后外层循环固定一个数,内层循环用双指针来实现,总的复杂度应该是
O
(
n
2
)
O(n^2)
O(n2)。
实现:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int l = i + 1, r = nums.size() - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (sum < 0)
++l;
else if (sum > 0)
--r;
else {
int left = nums[l], right = nums[r];
res.push_back(vector<int>{nums[i], nums[l], nums[r]});
while (l < r&&nums[l] == left) ++l;
while (l < r&&nums[r] == right) --r;
}
}
while (i + 1 < nums.size() && nums[i + 1] == nums[i])
++i;
}
return res;
}
};
注意要求must not contain duplicate triplets。因此要想办法避开,这里排序之后既可以使用双指针,又可以方便的避开重复值。