[面試題]在數組中找出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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM