Leetcode 78.子集

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

1.题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

2.思路

本题需要我们返回数组中的所有子集,而子集是什么呢,也就是说数组中的数字进行不限数字的任意组合都是数组的子集,甚至包括了数组本身以及空数组。

知道了子集的定义后,我们再来看这道题就比较熟悉了,我们很多次做过这种类似的题目,不同的子元素进行组合,然后将满足要求的组合返回结果,这就用到了回溯的思想,我们采用递归的方式来解决这个问题。

首先我们定义一个返回的数组以及一个递归函数,我们需要考虑递归的话需要处理些什么呢,,首先是递归的边界条件,也就是什么情况下递归结束,我们需要一个参数来记录当前的组合情况以及回溯时的情况,然后当这个参数的长度达到了传入数组的长度时,也就是获得了数组本身这个子数组时就要停止递归了就说明本次排查结束。然后每次递归的时候进行循环然后以当前的位置作为起始点来添加数字,保证回溯后采用下一种情况。

3.代码

var subsets = function(nums) {
    let res = []
    let deep = (path,index)=>{
        res.push(path)
        if(path.length===nums.length)return
        for(let i = index;i<nums.length;i++){
            let b = i+1
            deep(path.concat(nums[i]),b)
        }
    }
    deep([],0)
    return res 
};