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]
]
思路:用三个指针,两层循环,遍历整个数组,时间复杂度为O(n^2),由于需要去重,所以用Set来解决。
注:Set具有去重的功能,Set之所以会去重,和map有很大的关系。 看源码你会发现HashSet底层使用HashMap存储 ;TreeSet底层使用TreeMap存储 ;LinkedHashSet底层使用LinkedHashMap存储。被传进来的泛型对象当成了Map的键,因为Map键值重复的话新的键会覆盖旧的键值,所以Set不会重复。
package com.Ryan;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class ThreeSum {
public static void main(String[] args) {
ThreeSum threeSum=new ThreeSum();
int[] nums= {0,0,0,0};
List<List<Integer>> list=threeSum.threeSum(nums);
for (List<Integer> list2 : list) {
for (Integer integer : list2) {
System.out.print(integer+" ");
}
System.out.println();
}
}
public List<List<Integer>> threeSum(int[] nums) {
Set<List<Integer>> res=new HashSet<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length-2; i++) {
int j=i+1,k=nums.length-1,sum;
while (j<k) {
sum=nums[i]+nums[j]+nums[k];
if (sum==0) {
res.add(Arrays.asList(nums[i],nums[j++],nums[k--]));
}
else if (sum<0) {
j++;
}
else if (sum>0) {
k--;
}
}
}
return new LinkedList<>(res);
}
}