枚举排列组合
Given a set of distinct integers, return all possible subsets.
Example
If S = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
public ArrayList<ArrayList<Integer>> subsets(ArrayList<Integer> S) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (S == null || S.size() == 0) {
return result;
}
Collections.sort(S);
ArrayList<Integer> path = new ArrayList<Integer>();
dfs(result, path, S, 0);
return result;
}
private void dfs(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path,
ArrayList<Integer> S, int pos) {
result.add(new ArrayList<Integer>(path));
for (int i = pos; i < S.size(); i++) {
path.add(S.get(i));
dfs(result, path, S, i + 1);
path.remove(path.size() - 1);
}
}
思路:
DFS深度优先搜索。对已有的有序整数数组,找到第一/最后/任意位置的目标数字。
算法面试中如果需要优化O(n)的时间复杂度,那么只能是O(logn)的二分法。
DFS workflow:
DFS tree: