题目:
Given a set of distinct integers, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]解法:
上一题的更进一步,要求输出包含空集的所有子集。题目要求每个子集中元素有序,我们可以先对S排个序,然后递归,分成包含最大项的部分,和不包含最大项的部分
需要注意的是List没有clone方法,因此需要人工将子问题的结果拷贝一份,一份添加最大项,一份不加,然后合并。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class No78_Subsets {
public static void main(String[] args){
System.out.println(subsets(new int[]{4,7,6}));
}
public static List<List<Integer>> subsets(int[] S) {
Arrays.sort(S);
return subsetsWithIndex(S, S.length-1);
}
public static List<List<Integer>> subsetsWithIndex(int[] S, int last){
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(last < 0) return ret;
List<List<Integer>> withLast = subsetsWithIndex(S, last-1);
if(withLast.size() == 0){
List<Integer> element = new ArrayList<Integer>();
element.add(S[last]);
ret.add(element);
ret.add(new ArrayList<Integer>());
}
for(int i=0;i<withLast.size();i++){
List<Integer> clone = new ArrayList<Integer>();
for(int j=0;j<withLast.get(i).size();j++){
clone.add(withLast.get(i).get(j));
}
withLast.get(i).add(S[last]);
ret.add(clone);
ret.add(withLast.get(i));
}
return ret;
}
}