三数之和

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
 注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:


(-1, 0, 1)


(-1, -1, 2)


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * 给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
 注意事项
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:

(-1, 0, 1)

(-1, -1, 2)
 * @author Dell
 *
 */
public class Test57 {
 public static ArrayList<ArrayList<Integer>> threeSum(int[] numbers)
 {
	ArrayList<ArrayList<Integer>> result=new ArrayList<>();
	ArrayList<Integer> list=new ArrayList<>();
	 Arrays.sort(numbers);
	   for(int i=0;i<numbers.length-2;i++)
	   { 
		   if(i>0&&numbers[i-1]==numbers[i])  //第一次去重
			   continue;
		    int target=0-numbers[i];
		    int m=i+1;
		    int n=numbers.length-1;
		   while(m<n)
		   {
			  if(numbers[m]+numbers[n]>target)
			  {
				  n--;
			  }
			  else if(numbers[m]+numbers[n]<target)
			  {
				  m++;
			  }
			  else
			  {
				  list.add(numbers[i]);
				  list.add(numbers[m]);
				  list.add(numbers[n]);
				  result.add(list);
				  list=new ArrayList<>();
		    //第二次去重
				int k=m+1;
				while(k<n&&numbers[k]==numbers[m]) k++;
				 m=k;
				 
				 k=n-1;
				 while(k>m&&numbers[k]==numbers[n]) k--;
				 n=k;
				 
			  }
			   
		   }
		      
	   }

	 return result;
 }
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
	   int[] a=new int[n];
	   for(int i=0;i<n;i++)
	   {
		   a[i]=sc.nextInt();
	   }
     ArrayList<ArrayList<Integer>> list=null;
      list=threeSum(a);
     System.out.println(list);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值