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)
A solution set is:
(-1, 0, 1)
(-1, -1, 2)
题意:给定一个数组,要求取出一个三元组,要求三元组之和为零,且三元组不重复(三个数相同视为重复)
思路:要求去重,所以先排序,然后进行三次循环用于暴力寻找。由于不能是同一个元素重复三次,所以下一个循环的起点是上一个循环的值加一。在每一次循环时去重,由于经过排序,所以相同的数已经排在一起,那么除了第一次出现之外,后面遇到这个数则跳过计算。最后将得到的数字从小到大排序并添加到list中。
实现:
public class Solution {
public List<List<Integer>> threeSum( int[] num ) {
List<List<Integer>> list= new LinkedList<List<Integer>>();
Arrays. sort(num);//对num排序
for(int i =0;i <num .length ;i ++){
if(i >0&&num[i]==num[i-1])//去重,如果排序好的数组前后两个数字是相等的,那么之前肯定已经计算过这个数字了,本次跳过
continue;
for(int j =i +1;j <num .length ;j ++){
if(j >i +1&&num[j]==num[j-1])//去重,同上
continue;
for(int k =j +1;k <num .length ;k ++){
if(k >j +1&&num[k]==num[k-1])//去重,同上
continue;
if(num [i ]+num [j ]+num [k ]==0){
int l1 =num [i ];
int l2 =num [j ];
int l3 =num [k ];
List<Integer> ll= new LinkedList<Integer>();
if(l1 <l2 ){
ll.add( l1);
ll.add( l2);
if(l3 <l1 )
ll.add(0, l3);
else if (l3 >l1 &&l3<l2)
ll.add(1, l3);
else
ll.add( l3);
} else{
ll.add( l2);
ll.add( l1);
if(l3 <l2 )
ll.add(0, l3);
else if (l3 >l2 &&l3<l1)
ll.add(1, l3);
else
ll.add( l3);
}
list.add( ll);
}
}
}
}
return list ;
}
}