給定一個數組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]