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]
]
解法
先对数组进行排序,用i遍历数组,在每一个nums[i]的循环内,使用两个索引k、j分别指向nums[i+1]和nums的最后一个数,比较nums[j]+nums[k]与0-nums[i]的大小,若相等,则将这三个数存入结果中,若大于,则k++,小于则j–;注意要跳过重复的项
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> reslist=new LinkedList<List<Integer>>();
List<Integer> list;
Arrays.sort(nums);
if(nums.length<3||nums[0]>0||nums[nums.length-1]<0)
return reslist;
for(int i=0;i<nums.length-2;i++)
{
if(nums[i]>0)
break;
while(i>0&&i<nums.length-2&&nums[i]==nums[i-1])
i++;
int target=0-nums[i];
int k=i+1,j=nums.length-1;
while(k<j)
{
if(nums[k]+nums[j]==target)
{
list=new LinkedList<Integer>();
list.add(nums[i]);
list.add(nums[k]);
list.add(nums[j]);
reslist.add(list);
while(k<j&&nums[k]==nums[k+1])k++;
while(k<j&&nums[j]==nums[j-1])j--;
k++;
j--;
}
else if(nums[k]+nums[j]<target)
k++;
else
j--;
}
}
return reslist;
}
Runtime: 32 ms, faster than 99.77% of Java online submissions for 3Sum.
Memory Usage: 51 MB, less than 24.01% of Java online submissions for 3Sum.