一 题目
二 代码
//回溯
let subsets=function(nums){
//存放所有子集
let res=[];
//定义dfs函数
let dfs=function(current,index){
//current表示当前数组
//index表示nums中当前需要遍历的数字的数组序
//先将当前数据加入结果集res
res.push(current);
//循环将index及之后的序号对应的数字的情况
for(let i=index;i<nums.length;i++){
dfs(current.concat(nums[i]),i+1);
}
}
//初始化
dfs([],0)
return res;
}
//递归
let subsets=function(nums){
//结果集初始化为空
let res=[[]];
for(let i=0;i<nums.length;i++){
res.forEach(item=>{
res.push([...item,nums[i]])
})
}
//初始化res=[[]]
//i=0,nums[i]为1,res=[[],[1]]
//i=1,nums[i]为2,res=[[],[1],[2],[1,2]]
//i=2,nums[i]为3,res=[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
return res;
}
//位运算
var subsets = function(nums) {
let res = []
//长度为n的数组,全排列刚好有2的n次方种情况
for(let i=0;i<Math.pow(2,nums.length);i++){
//每次得到的子数组
let subset=[];
for(let j=0;j<nums.length;j++){
//1<<j在j分别取0,1,2...时得到1,10,100...
if(i&(1<<j)){
//选择将nums中的那些数字放入subset中
subset.push(nums[j])
}
}
console.log(subset)
res.push(subset);
}
return res;
}