Total Accepted: 10972 Total Submissions: 40240
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], [] ]
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
Arrays.sort(S);
return getSubsets(S, 0);
}
public ArrayList<ArrayList<Integer>> getSubsets(int[] S, int start_index) {
ArrayList<ArrayList<Integer>> allSubsets;
if (start_index == S.length) {
allSubsets = new ArrayList<ArrayList<Integer>>();
allSubsets.add(new ArrayList<Integer>());
} else {
allSubsets = getSubsets(S, start_index + 1);
ArrayList<ArrayList<Integer>> tmpSubsets = new ArrayList<ArrayList<Integer>>();
for (ArrayList<Integer> subset : allSubsets) {
ArrayList<Integer> s = new ArrayList<Integer>();
s.add(S[start_index]);
s.addAll(subset);
tmpSubsets.add(s);
}
allSubsets.addAll(tmpSubsets);
}
return allSubsets;
}
}
DFS
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path = new ArrayList<Integer>();
list.add(new ArrayList<Integer>());
Arrays.sort(S);
dfs(S, list, path, 0);
return list;
}
public void dfs(int[] S, ArrayList<ArrayList<Integer>> list, ArrayList<Integer> path, int index) {
for (int i = index; i < S.length; i++) {
path.add(S[i]);
list.add(new ArrayList<Integer>(path));
dfs(S, list, path, i + 1);
path.remove(path.size() - 1);
}
}
}
public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path = new ArrayList<Integer>();
list.add(new ArrayList<Integer>());
Arrays.sort(S);
dfs(S, list, path, 0);
return list;
}
public void dfs(int[] S, ArrayList<ArrayList<Integer>> list, ArrayList<Integer> path, int index) {
if (index < S.length) {
path.add(S[index]);
list.add(new ArrayList<Integer>(path));
dfs(S, list, path, index + 1);
path.remove(path.size() - 1);
dfs(S, list, path, index + 1);
}
}
}