求子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路 :
1、确定一个tags标记数组,用于确定某个元素是否被选择
2、确定递归的终止条件为 确定元素是否标记的数目等于数组的长度
3、子集为要么选择该元素,要么不选该元素
4、递归完记得取消递归前的状态,并初始化为下一次递归的状态
class Solution {
public List<List<Integer>> subsets(int[] nums) {
int[] tags = new int[nums.length];
List<List<Integer>> results = new ArrayList<>();
sets(nums,0,tags,results);
return results;
}
public void sets(int[] nums,int l,int[] tags, List<List<Integer>> results){
if(l>=nums.length){
List<Integer> list = new ArrayList<>();
for(int i=0;i<tags.length;i++){
if(tags[i]==1){
list.add(nums[i]);
}
}
results.add(list);
return;
}
tags[l]=0;
sets(nums,l+1,tags,results);
tags[l]=1;
sets(nums,l+1,tags,results);
}
}
全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
思路:
1、确定一个tags标记数组,确定数组元素是否被选中
2、确定递归的终止条件为选择的元素等于了数组长度,就添加到结果集中
3、每次循环判断元素已被选中就跳到下次循环
4、添加一个元素,初始化标记数组为选中,然后开始递归函数,函数结束要删除该元素,并初始化为未选中,为了进行下一种情况的递归
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> l = new ArrayList<>();
int[] tags = new int[nums.length];
for(int i=0;i<tags.length;i++){
tags[i]=0;
}
per(nums,tags,0,l,res);
return res;
}
public void per(int[] nums,int[] tags,int n,List<Integer> list,List<List<Integer>> res){
if(n==nums.length){
List<Integer> newList = new ArrayList<>(list);
res.add(newList);
return;
}
for(int i=0;i<nums.length;i++){
if(tags[i]==1){continue;}
list.add(nums[i]);
tags[i]=1;
per(nums,tags,n+1,list,res);
list.remove(list.size()-1);
tags[i]=0;
}
}
}