题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
首先最容易想到的是三重暴力循环,在不重复三元组的情况下判断是否三数之和为0,是则记录下来
上代码!
public class Test01 {
public static List<List<Integer>> threeSum(int[] nums) {
Set<List<Integer>> set = new HashSet<List<Integer>>();
for(int i=0;i<nums.length;i++) {
for(int j=1;j<nums.length;j++) {
for(int k=2;k<nums.length;k++) {
if(i!=j && i!=k && j!=k) {
if(nums[i]+nums[j]+nums[k]==0) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
Collections.sort(list);
set.add(list);
}
}
}
}
}
return new ArrayList<List<Integer>>(set);
}
}
在执行最后一个测试案例时
显然暴力行不通,换思路!
夹逼法
public class Test02 {
public static List<List<Integer>> threeSum(int[] nums) {
if(nums==null||nums.length<3) {
return Collections.emptyList();
}
Set<List<Integer>> set = new HashSet<List<Integer>>();
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++) {
int begin = i+1;
int end = nums.length-1;
while(begin < end) {
int sum = -(nums[begin]+nums[end]);
if(sum == nums[i]) {
List<Integer> list = new ArrayList<>();
list.add(nums[begin]);
list.add(nums[i]);
list.add(nums[end]);
Collections.sort(list);
set.add(list);
}
if(sum <= nums[i]) {
end--;
}else {
begin++;
}
}
}
return new ArrayList<List<Integer>>(set);
}
}
如有更好的解法请动动小手在评论区留言!!!