LeetCode:78.子集 | 刷题打卡

253 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

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

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

示例 1:

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

示例 2:

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

二、思路分析

首先根据题目描述我们可以确认的要求有:

  1. 获取输入数组 nums 的所有子集
  2. 子集是不重复的

然后根据上述要求我们可以知道,该题是有 出路死路 的,所以可以优先考虑回溯算法。

最后,我们可以使用递归来模拟出所有的情况,并且保证子集中数组元属的顺序是和 nums 一致的,收集到所有到达递归终点的情况后,返回即可。

三、AC 代码

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    const res = [] // 返回的内容
    
    /**
     * 回溯
     * @param {number[]} 路径
     * @param {number} 路径长度
     * @param {number} 起始位置
     * @return {number[][]}
     */
    const backtrack = (path, l, start) => {
        // 判断当前路径长度是否和指定长度一致
        // 如果是,则收集数据并直接返回
        if(path.length === l) {
            return res.push(path)
        }
        
        // 使用递归模拟所有的情况
        // start 用来确保元素顺序的正确性
        for(let i = start; i < nums.length; i++) {
            backtrack(path.concat(nums[i]), l, i + 1)
        }
    }
    
    // 通过遍历去收集长度分别为 0、1、2、...、nums.lengt 的数据
    for(let i = 0; i <= nums.length; i++) {
        backtrack([], i, 0)
    }
    
    // 返回收集到的内容
    return res
};

四、总结

实际上需要关注的就是,如何判断去判断判断子集的唯一性和有效性,也就是使用 start 来保证元素顺序的正确性

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情