NC54 数组中相加和为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)
0 <= S.length <= 1000
示例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<ArrayList<Integer>> ans = new ArrayList<>();
if(num == null || num.length == 0){
return ans ;
}
Arrays.sort(num);
for(int i = 0 ; i < num.length ; i++){
if(i > 0 && num[i] == num[i-1]){
continue ;
}
int target = -num[i];
int left = i+1 ;
int right = num.length-1 ;
towsum(num , left , right , target , ans) ;
}
return ans ;
}
public void towsum(int[] num , int left , int right , int target , ArrayList<ArrayList<Integer>> ans){
while(left < right){
if(num[left] + num[right] == target){
ArrayList<Integer> temp = new ArrayList<>();
temp.add(-target);
temp.add(num[left]);
temp.add(num[right]);
ans.add(temp) ;
left++ ;
right-- ;
while(left< right && num[left] == num[left-1]){
left++ ;
}
while(left < right && num[right] == num[right+1]){
right-- ;
}
}else if(num[left] + num[right] < target){
left++ ;
}else{
right-- ;
}
}
}
}