Problem
Given a set of distinct integers, return all possible subsets.
Notice
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
Have you met this question in a real interview? Yes
Example
If S = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路
- 假设数组: [1, 2, 3]
- 找到整个数组的subsets相当于分别找到以1, 2, 3开头的subset
- 找到1开头的subset, 相当于1已经存在于路径当中, 找到1后面, 即分别以2, 3 开头的subset
- 直到数组遍历完为止
两种写法
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
result.add(new ArrayList<Integer>());
if (nums == null || nums.length == 0) return result;
Arrays.sort(nums);
helper(nums, result, new ArrayList<Integer>(), 0);
return result;
}
private void helper(int[] nums, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path, int startIndex) {
if (nums.length == startIndex) return;
for (int i = startIndex; i < nums.length; i++) {
path.add(nums[i]);
result.add(new ArrayList<Integer>(path));
helper(nums, result, path, i + 1);
path.remove(path.size() - 1);
}
}
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (nums == null || nums.length == 0) {
result.add(new ArrayList<Integer>());
return result;
}
Arrays.sort(nums);
helper(nums, result, new ArrayList<Integer>(), 0);
return result;
}
private void helper(int[] nums, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path, int startIndex) {
if (nums.length < startIndex) return;
result.add(new ArrayList<Integer>(path));
for (int i = startIndex; i < nums.length; i++) {
path.add(nums[i]);
helper(nums, result, path, i + 1);
path.remove(path.size() - 1);
}
}