原题
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.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
大意
给定一个数组,找出所有的3个元素的子集合,使得子集合的和为0;并且保证这些子集合没有重复的
思路
首先给数组排好序,先确定第一个元素,然后其他两个元素使用两个指针进行遍历,如果三者的和大于0 ,则右指针左移,否则左指针右移。
第一次写的代码没有考虑重复的数组,结果比较啰嗦,先使用的set集合,又转换为了list集合,耗时较久。
代码
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>>lists=new ArrayList<List<Integer>>();
Set<List<Integer>>set=new HashSet<List<Integer>>();
for (int i = 0; i < nums.length; i++) {
int left=i+1;
int right=nums.length-1;
while(left<right){
if(0==nums[i]+nums[left]+nums[right]){
List<Integer>cur=new ArrayList<>();
//lists<Integer> cur=new ArrayList<Integer>();
cur.add(nums[i]);
cur.add(nums[left]);
cur.add(nums[right]);
set.add(cur);
left++;
right--;
}
else if (0<nums[i]+nums[left]+nums[right]) {
right--;
}
else {
left++;
}
}
}
Iterator iterator = set.iterator();
while( iterator.hasNext()) {
ArrayList<Integer> arrayList = (ArrayList<Integer>) iterator.next();
lists.add(arrayList);
}
return lists;
}
}
看了discuss讨论的,
第二次的代码就考虑了重复的:
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>>lists=new ArrayList<List<Integer>>();
for (int i = 0; i < nums.length; i++) {
//考虑重复元素
if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
int left=i+1;
int right=nums.length-1;
while(left<right){
if(0==nums[i]+nums[left]+nums[right]){
lists.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
//考虑重复元素
while(left<right&&nums[left]==nums[left+1]) left++;
while(left<right&&nums[right]==nums[right-1]) right--;
left++;
right--;
}
else if (0<nums[i]+nums[left]+nums[right]) {
right--;
}
else {
left++;
}
}
}
}
return lists;
}
}