给你一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ret;
if(nums.size()<=2)
return ret;
sort(nums.begin(),nums.end());
for(int i =0; i<nums.size()-2;i++)
{
int j = i+1;
int k = nums.size()-1;
while(j<k){
vector<int> cur;
if(nums[i]+nums[j]+nums[k]==0){
cur.push_back(nums[i]);
cur.push_back(nums[j]);
cur.push_back(nums[k]);
ret.push_back(cur);
++j;
--k;
while(j<k && nums[j-1]==nums[j])
++j;
while(j<k && nums[k+1]==nums[k])
--k;
}
else if(nums[i]+nums[j]+nums[k]<0){
++j;
}
else
--k;
}
while(i<nums.size()-1 && nums[i]==nums[i+1])
++i;
}
return ret;
}
};
python3 版本
class Solution:
def threeSum(self, nums: [int]) -> [[int]]:
nums.sort()
res, k = [], 0
for k in range(len(nums) - 2):
if nums[k] > 0: break # 1. because of j > i > k.
if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.
i, j = k + 1, len(nums) - 1
while i < j: # 3. double pointer
s = nums[k] + nums[i] + nums[j]
if s < 0:
i += 1
while i < j and nums[i] == nums[i - 1]: i += 1
elif s > 0:
j -= 1
while i < j and nums[j] == nums[j + 1]: j -= 1
else:
res.append([nums[k], nums[i], nums[j]])
i += 1
j -= 1
while i < j and nums[i] == nums[i - 1]: i += 1
while i < j and nums[j] == nums[j + 1]: j -= 1
return res