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.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:先将数组排序,然后开始遍历,先确定一个数,遇到这个数与前面的数相同时,则跳过,然后用双指针法,在该数的右边找两个数使得这三个数相加为0;
C++
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
for(int i = 0; i < nums.size(); ++ i){
while(i != 0 && i < nums.size() && nums[i-1] == nums[i])
++ i;
if(i == nums.size())
break;
int target = -nums[i], low = i+1, high = nums.size() - 1;
while(low < high){
int temp = nums[low] + nums[high];
if(temp == target){
result.push_back({nums[i], nums[low], nums[high]});
while(low < high && nums[low] == (*result.rbegin())[1])
++ low;
while(low < high && nums[high] == (*result.rbegin())[2])
-- high;
}
else if(temp > target)
-- high;
else
++ low;
}
}
return result;
}
};
Python
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
nums = sorted(nums)
for i in range(len(nums)):
if i and nums[i] == nums[i-1]:
continue
low, high = i + 1, len(nums) - 1
while low < high:
temp = nums[i] + nums[low] + nums[high]
if temp == 0:
result.append([nums[i], nums[low], nums[high]]);
while low < high and nums[low] == result[-1][1]:
low += 1
while low < high and nums[high] == result[-1][2]:
high -= 1
elif temp > 0:
high -= 1
else:
low += 1
return result