Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: 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],
[]
]
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
if(nums==null || n<=0) return res;
ArrayList<Integer> tmp = new ArrayList<Integer>();
res.add(tmp);
subsetsCore(n,0,tmp,nums);
return res;
}
public void subsetsCore(int n, int index, ArrayList<Integer> tmp, int[] nums){
if(tmp.size()>n || index>=n){
return;
}
for(int i=index; i<n; i++){
tmp.add(nums[i]);
ArrayList<Integer> temp = new ArrayList<Integer>(tmp);
res.add(temp);
subsetsCore(n,i+1,tmp,nums);
tmp.remove(tmp.size()-1);
}
}
}
这个题目又是利用回溯法,只要设计到这种求所有排列的题目,基本都是采用回溯法
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
int n = nums.length;
if(nums==null || n<=0) return res;
ArrayList<Integer> tmp = new ArrayList<Integer>();
res.add(tmp);
Arrays.sort(nums);
subsetsWithDupCore(n,0,tmp,nums);
return res;
}
public void subsetsWithDupCore(int n, int index, ArrayList<Integer> tmp, int[] nums){
if(tmp.size()>n || index>=n){
return;
}
for(int i=index; i<n; i++){
tmp.add(nums[i]);
ArrayList<Integer> temp = new ArrayList<Integer>(tmp);
res.add(temp);
subsetsWithDupCore(n,i+1,tmp,nums);
tmp.remove(tmp.size()-1);
while(i<nums.length-1 && nums[i]==nums[i+1]) i++;
}
}
}
经典套路一般是题目I不需要排序,但是题目II需要排序,然后通过排序,去掉重复的元素,使集合中没有重复的值