https://leetcode-cn.com/problems/subsets/ 数组、位运算、回溯算法

原生一行

利用 reduce 迭代,在编译器里面可以跑,但是 leetcode 会编译报错

  1. function subsets(nums: number[]): number[][] {
  2. return nums.reduce((total,num)=>total.concat(total.map(item=>item.concat(num))),[[]])
  3. };

回溯一

【78】子集:中等 - 图1
【78】子集:中等 - 图2

function subsets(nums: number[]): number[][] {
    const res:number[][] = [];

    const dfs = (index: number, list: number[]) => {
        if(index === nums.length) {
              // 如果这里不用 slice() 会全部变成空数组,因为那样push的只是 list 的引用,list 最后都会变为空数组,应该push一个新数组
            res.push(list.slice()) 
            return
        }
        list.push(nums[index])
        dfs(index + 1, list)
        list.pop()
        dfs(index + 1, list)
    }

    dfs(0, [])
    return res
};

回溯二

【78】子集:中等 - 图3

function subsets(nums: number[]): number[][] {
    const res:number[][] = [];

    const dfs = (index: number, list: number[]) => {
        res.push(list.slice())
        for(let i = index; i < nums.length; i++) {
            list.push(nums[i])
            dfs(i + 1, list)
            list.pop()
        }
    }

    dfs(0, [])
    return res
};