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] ]
这一题算作不是很难的题目,但还是有一些坑需要我们注意。我一开始想的很简单,用3个for循环来做,后来调试的时候才发现这样,总是会将重复的组add到list中去,这里附上我的错误代码。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new LinkedList<>();
Arrays.sort(nums);//一种优化快排 n*logn
int n=nums.length;
for(int i=0;i<n-2;i++){
for(int j=i+1;j<n-1;j++){
for(int k=j+1;k<n;k++){
if(nums[i]>=0)
break;
if(nums[i]+nums[j]+nums[k]==0){
if(!list.contains(Arrays.asList(nums[i],nums[j],nums[k])));//无法解决问题
list.add(Arrays.asList(nums[i],nums[j],nums[k]));
}
}
}
}
return list;
}
}
我一开始想用list中自带的contains来解决重复问题,但是事实证明我总是把事情想得太简单,contains只能解决地址相同且属性相同的问题,对于属性相同但是地址不同是无法判断出来的。没办法,这样只能每一步都要先来判断nums[i],nums[j],nums[k]是否会和前面重复出现相同的数,如果出现相同的数就用continue来跳过好了。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new LinkedList<>();
Arrays.sort(nums);//一种优化快排 n*logn
int n=nums.length;
for(int i=0;i<n-2;i++){
if(i>0&&nums[i]==nums[i-1]) //跳过重复的部分
continue;
int j=i+1,k=n-1;
int tag=-nums[i];
while(j<k){
if(nums[j]+nums[k]==tag){
list.add(Arrays.asList(nums[i],nums[j],nums[k]));
j++;
k--;
while(j<k&&nums[j]==nums[j-1]) j++;
while(j<k&&nums[k]==nums[k+1]) k--;
}
else if(nums[j]+nums[k]<tag){
j++;
}
else
k--;
}
}
return list;
}
}