目录
数组中相加和为0的三元组
描述
给出一个有n个元素的数组S,S中是否有元素a、b、c满足a+b+c=0?找出数组S中所有满足条件的三元组。
注意:
- 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
- 解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10)
示例1
输入
[0]
返回值
[]
示例2
输入
[-2,0,1,1,2]
返回值
[[-2,0,2],[-2,1,1]]
示例3
输入
[-10,0,10,20,-10,-40]
返回值
[[-10,-10,20],[-10,0,10]]
方法:循环搜索
先将数组排序,然后从小到大开始遍历,这里我用的是三个循环,也可以一个循环加双指针,
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<Integer> arr=new ArrayList<>();
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
if (num.length<3) return res;
Arrays.sort(num);//将数组从小到大进行排序
if (num[num.length-1]<0) return res;//若数组最大的元素都小于0或者元素个数不超过3个,则没有满足的三元组
for (int i = 0; i < num.length-2; i++) {
if (num[i]>0) break;
if(i>0 && num[i]==num[i-1]) continue;
for (int j = i+1; j < num.length-1; j++) {
if(j>i+1 && num[j]==num[j-1]) continue;
int need=0-num[i]-num[j];
if (need>num[num.length-1] || need<0) continue;
for (int k = j+1; k < num.length; k++) {
if (need<num[k]){
break;
}else if (need==num[k]){
ArrayList<Integer> triple=new ArrayList<>();
triple.add(num[i]);triple.add(num[j]);triple.add(num[k]);
res.add(triple);
break;
}
}
}
}
return res;
}
}
该方法时间和空间消耗表现较好,