这个题就是用下递归,逐个把最大的数放入combine(i-1, k-1)中,成为combine (i, k).
举个例子容易理解些。 combine(3, 1) 成为 combine (4, 2)
[1, 4] [2, 4] [3, 4]
[1, 3] [2, 3]
[1, 2]
我觉得这个题用recursive写非常的清晰和整齐。我自己都被程序感动了。
代码如下
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
if (n < k) return null;
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (k == 1){
for (int i = 1; i <= n; i++){
ArrayList<Integer> current = new ArrayList<Integer>();
current.add(i);
result.add(current);
}
} else {
for (int i = n; i >= k; i--){
for (ArrayList<Integer> current : combine(i-1, k-1)){
current.add(i);
result.add(current);
}
}
}
return result;
}
这个写法太棒了 我也感动地快要流泪了
ReplyDelete