题目描述(牛客需要排序输出)
现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
- 你给出的子集中的元素必须按非递增的顺序排列
- 给出的解集中不能出现重复的元素
例如:
如果S=[1,2,3], 给出的解集应为:
[↵ [3],↵ [1],↵ [2],↵ [1,2,3],↵ [1,3],↵ [2,3],↵ [1,2],↵ []↵]
思路:用到回溯方法,具体思想可参考:回溯法
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
res.add(new ArrayList<Integer>());
if(S==null||S.length==0)
return res;
Arrays.sort(S);
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=1;i<=S.length;i++){
backtracking(S,i,0,list);
}
return res;
}
public void backtracking(int[] S,int k,int start,ArrayList<Integer> list){
if(k<0){
return;
}
else if(k==0){
res.add(new ArrayList<Integer>(list));
}
else{
for(int j=start;j<S.length;j++){
list.add(S[j]);
backtracking(S,k-1,j+1,list);
list.remove(list.size()-1);
}
}
}
}
题目描述(LeetCode无需排序输出)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路:对于题目中给的例子[1,2,3]来说,最开始是空集,那么我们现在要处理1,就在空集上加1,为[1],现在我们有两个自己[]和[1],下面我们来处理2,我们在之前的子集基础上,每个都加个2,可以分别得到[2],[1, 2],那么现在所有的子集合为[], [1], [2], [1, 2],同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了。实现过程:
[]
[] [1]
[] [1] [2] [1,2]
[] [1] [2] [1,2] [3] [1,3] [2,3] [1,2,3]
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
res.add(new ArrayList<Integer>());
if(nums==null||nums.length==0){
return res;
}
for(int i=0;i<nums.length;i++){
int size=res.size();
for(int j=0;j<size;j++){
List<Integer> cur=new ArrayList<Integer>(res.get(j));
cur.add(nums[i]);
res.add(new ArrayList<Integer>(cur));
}
}
return res;
}
}