原题网址:https://leetcode.com/problems/subsets/
Given a set of distinct integers, nums, 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 nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]方法:深度优先搜索。
public class Solution {
private void find(int[] nums, int pos, int[] subset, int size, int target, List<List<Integer>> subsets) {
if (size == target) {
List<Integer> result = new ArrayList<>(target);
for(int i=0; i<size; i++) result.add(subset[i]);
subsets.add(result);
return;
}
for(int i=pos; i<=nums.length-(target-size); i++) {
if (i>pos && nums[i]==nums[i-1]) continue;
subset[size] = nums[i];
find(nums, i+1, subset, size+1, target, subsets);
}
}
public List<List<Integer>> subsets(int[] nums) {
Arrays.sort(nums);
int[] buf = new int[nums.length];
List<List<Integer>> subsets = new ArrayList<>();
for(int i=0; i<=nums.length; i++) {
find(nums, 0, buf, 0, i, subsets);
}
return subsets;
}
}
优化:
public class Solution {
private void find(int[] nums, int pos, int[] subset, int size, List<List<Integer>> subsets) {
List<Integer> result = new ArrayList<>(size);
for(int i=0; i<size; i++) result.add(subset[i]);
subsets.add(result);
for(int i=pos; i<nums.length; i++) {
subset[size] = nums[i];
find(nums, i+1, subset, size+1, subsets);
}
}
public List<List<Integer>> subsets(int[] nums) {
Arrays.sort(nums);
int[] buf = new int[nums.length];
List<List<Integer>> subsets = new ArrayList<>();
find(nums, 0, buf, 0, subsets);
return subsets;
}
}