首页 > 技术文章 > [面试题]在数组中找出3个数使得它们和为0

ttaobupt 2017-07-06 23:47 原文

给定一个数组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]

推荐阅读