给定一组不同的整数S,返回所有可能的子集。
注意:1)子集中的元素必须按降序排列。2)解决方案集不得包含重复的子集。
例如,给定S = [1,2,3],该方法将返回:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思想
给定n个不同整数的集合S,Sn和Sn-1之间存在关系。Sn-1的子集是{Sn-1的子集}与{Sn-1中的每个元素+一个元素}的并集。因此,可以快速将Java解决方案形式化。
Java解决方案
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
if (S == null)
return null;
Arrays.sort(S);
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < S.length; i++) {
ArrayList<ArrayList<Integer>> temp = new ArrayList<ArrayList<Integer>>();
//get sets that are already in result
for (ArrayList<Integer> a : result) {
temp.add(new ArrayList<Integer>(a));
}
//add S[i] to existing sets
for (ArrayList<Integer> a : temp) {
a.add(S[i]);
}
//add S[i] only as a set
ArrayList<Integer> single = new ArrayList<Integer>();
single.add(S[i]);
temp.add(single);
result.addAll(temp);
}
//add empty set
result.add(new ArrayList<Integer>());
return result;
} |