leetcode78 subSets

181 阅读1分钟

一 题目

二 代码

//回溯
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;
}