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], [] ]
这道题和combinations那道题差不多,都不输出有重复的集合。区别在于输出的个数,即把combinations那道题中的k变为变化的,在递归函数里面加限定长度len好像放哪里都不合适,这时考虑在递归外加,这样既可达到效果。
Source
public class Solution {
public List<List<Integer>> subsets(int[] S) {
List<List<Integer>> st = new ArrayList<List<Integer>>();
List<Integer> a = new ArrayList<Integer>();
st.add(a);
if(S.length == 0) return st;
Arrays.sort(S);
int start = 0;
boolean[] visited = new boolean[S.length + 1];
for(int len = 1; len <= S.length; len++)
searchNum(start, len, S, st, a, visited);
return st;
}
public void searchNum(int start, int len, int[] S, List<List<Integer>> st, List<Integer> a, boolean[] visited){
if(a.size() == len){
st.add(new ArrayList<Integer>(a)); //注意递归时的st添加要为a新分配空间
return;
}
for(int i = start; i < S.length; i++){
if(!visited[i]){
a.add(S[i]);
visited[i] = true;
searchNum(i, len, S, st, a, visited);
a.remove(a.size() - 1); //remove***
visited[i] = false;
}
}
}
}
Test
public static void main(String[] args){
int[] S = {0};
System.out.println(new Solution().subsets(S));
}