题目:
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
题意:
从给定的数组中找出所有三个数相加和为0的组合。组合需要满足 a ≤ b ≤ c。
思路:
先排序,然后左右夹逼,复杂度O(n2)。这个方法可以推广到k-sum,先排序,然后做k。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size()<3){
return result;
}
const int target = 0;
sort(nums.begin(), nums.end());
auto last = nums.end();
for(auto i=nums.begin(); i<last-2; i++){
auto j = i+1;
if(i>nums.begin() && *i==*(i-1))
continue;
auto k = last-1;
while(j<k){
if(*i+*j+*k<target){
++j;
while(*j==*(j-1) && j<k)
++j;
}else if(*i+*j+*k>target){
--k;
while(*k==*(k+1) && j<k)
--k;
}else{
result.push_back({*i, *j, *k});
++j;
--k;
while(*j==*(j-1) && *k==*(k+1) && j<k)
++j;
}
}
}
return result;
}
};
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new LinkedList<>();
for(int i=0; i<nums.length-2; i++){
if(i==0 || (i>0 && nums[i]!=nums[i-1])){
int j = i+1;
int k = nums.length-1;
int target = 0 - nums[i];
while(j<k){
if(nums[j]+nums[k]==target){
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
while(j<k && nums[j]==nums[j+1])
j++;
while(j<k && nums[k]==nums[k-1])
k--;
j++;
k--;
}else if(nums[j]+nums[k]<target){
j++;
}else{
k--;
}
}
}
}
return result;
}
}