爲此,您可以使用下面的遞歸方法創建的列表:
public static<T> ArrayList<ArrayList<T>> getPermutations (List<T> elements, int k) {
return getPermutations (elements,k,0);
}
public static<T> ArrayList<ArrayList<T>> getPermutations (List<T> elements, int k, int i) {
ArrayList<ArrayList<T>> results = new ArrayList<>();
if(k > 0) {
int n = elements.size();
for(int j = i; j <= n-k; j++) {
T val = elements.get(j);
ArrayList<ArrayList<T>> tails = getPermutations(elements,k-1,j+1);
for(ArrayList<T> tail : tails) {
ArrayList<T> result = new ArrayList<>();
result.add(val);
result.addAll(tail);
results.add(result);
}
}
} else {
results.add(new ArrayList<T>());
}
return results;
}
你然後可以運行它(jDoodle):
ArrayList<Character> set = new ArrayList<>();
set.add('a');
set.add('b');
set.add('c');
for(ArrayList<Character> element : getPermutations(set,2)) {
System.out.println(element);
}
System.out.println("----------");
for(ArrayList<Character> element : getPermutations(set,3)) {
System.out.println(element);
}
System.out.println("----------");
set.add('d');
for(ArrayList<Character> element : getPermutations(set,2)) {
System.out.println(element);
}
System.out.println("----------");
for(ArrayList<Character> element : getPermutations(set,3)) {
System.out.println(element);
}
產生:
[a, b]
[a, c]
[b, c]
----------
[a, b, c]
----------
[a, b]
[a, c]
[a, d]
[b, c]
[b, d]
[c, d]
----------
[a, b, c]
[a, b, d]
[a, c, d]
[b, c, d]
程序的工作原理如下:k
是我們仍然要挑元素的數量,並且i
是當前偏移值。最初該偏移值是0
。
現在我們從i
重複n-k
尋找潛在的候選人成爲頭的一部分。該範圍內的每個元素將成爲某些組合的頭部。我們對列表的其餘部分執行遞歸。遞歸生成列表中剩餘部分的所有列表,其中包含k-1元素。那麼我們的工作就是在前面添加一個頭並返回列表。
通過使用特殊形式的LinkedList
(這在邏輯和函數式編程語言中很常見),可以實現更快和更保守的內存保存。
'N'是輸入的一部分以及?那麼對於'n = 3',你想要生成三個元素的所有組合? –
是的,n是一個輸入參數。也許k會更適合。從具有n個元素的集合中,我想要所有具有k個元素的組合。應該有「n選擇k」組合。 – MWin123
這可以通過[組合數字系統](http://stackoverflow.com/a/37736843/1090562) –