輸出一個集合的所有子集合-Java程式碼實現(一)
阿新 • • 發佈:2019-02-09
找出一個集合的所有子集合,用排列組合的方式來解答此問題的話,假設集合裡面有n個元素,那個子集合的數目為2^n.
具體思路為:對於集合裡面的任何一個元素,有兩種可能,一種是在子集合裡,另一種是不在子集合裡。假如我們已經得到n-1個元素的子集合,那麼n個元素的子集合是:n-1個元素的子集合 + n-1個元素的子集合中的所有集合都新增進額外的那個元素。在本題中,將集合劃分為 set[0] 和set[1...n-1];
遞迴思路,程式碼如下:
static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> set, int index){ ArrayList<ArrayList<Integer>> allsubsets; if(set.size() == index){ allsubsets = new ArrayList<ArrayList<Integer>>(); allsubsets.add(new ArrayList<Integer>()); //empty set }else{ allsubsets = getSubsets(set, index+1); int item = set.get(index); ArrayList<ArrayList<Integer>> moresubsets = new ArrayList<ArrayList<Integer>>(); for(ArrayList<Integer> s: allsubsets){ ArrayList<Integer> newSubset = new ArrayList<Integer>(); newSubset.addAll(s); newSubset.add(item); moresubsets.add(newSubset); } allsubsets.addAll(moresubsets); } return allsubsets; } public static void main(String[] args){ ArrayList<Integer> s = new ArrayList<Integer>(); s.add(1); s.add(2); s.add(3); ArrayList<ArrayList<Integer>> allsubsets = getSubsets(s, 0); for(ArrayList<Integer> set : allsubsets){ System.out.println(set); }
輸出結果如下:
[]
[3]
[2]
[3, 2]
[1]
[3, 1]
[2, 1]
[3, 2, 1]