[面试题]在数组中找出3个数使得它们和为0
给定一个数组S,试找出3个数a, b, c,使得a+b+c=0。也即从集合中找出所有的和为0的3个数。
例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1)。注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑。
当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1)。
参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给的代码稍微有些问题。
使用Java代码重写算法
1 package com.sum3; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.HashSet; 6 import java.util.List; 7 import java.util.Set; 8 9 public class Sum3 { 10 11 private static Set<List<Integer>> fing_sum3(List<Integer> arr){ 12 Collections.sort(arr);//先对数组进行排序 13 for(Integer aInteger : arr){ 14 System.out.println(aInteger); 15 } 16 List<Integer> list3 ; 17 Set<List<Integer>> setList = new HashSet<>(); 18 19 for(int i = 0; i < arr.size()-2; i++){ 20 int j = i+1; 21 int k = arr.size() - 1; 22 while(j < k){ 23 //先固定arr[i]不动,左右一定逼近;arr[j]太小,往前移动一位 24 if (arr.get(i) + arr.get(j) + arr.get(k) < 0 ) { 25 j++; 26 } else if(arr.get(i) + arr.get(j) + arr.get(k) > 0){ 27 k--; 28 }else { 29 list3 = new ArrayList<>(); 30 list3.add(arr.get(i)); 31 list3.add(arr.get(j)); 32 list3.add(arr.get(k)); 33 setList.add(list3); 34 //j++;//这个需要删掉,不然的话有些元素没有被计算 35 k--; 36 } 37 } 38 } 39 return setList; 40 } 41 42 43 public static void main(String[] args) { 44 Integer[] list = {2,1,0,-1,1,4,2,-2,-3}; 45 ArrayList<Integer> arrayList = new ArrayList<>(list.length); 46 Collections.addAll(arrayList, list); 47 Set<List<Integer>> output = fing_sum3(arrayList); 48 for(List<Integer> list2 : output){ 49 System.out.println(list2); 50 } 51 } 52 53 }
输出结果:
-3 -2 -1 0 1 1 2 2 4
[-3, -1, 4]
[-3, 1, 2]
[-2, 1, 1]
[-2, 0, 2]
[-1, 0, 1]