LeetCode 算法:幂集

239 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 20 天,点击查看活动详情

幂集

原题地址

幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。

说明:解集不能包含重复的子集。

示例:

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

思路分析

方法一

  1. 题目中需要获取一个数组中所有的子集,需要定义一个辅助函数,来对数组进行深度遍历;
  2. 定义 help 方法,接收两个入参,path 表示深度遍历过程中的数组,start 表示深度遍历的起点,那么首先将 path 本身放入结果集中,另外,如果当前的元素不在 path 中,那么将当前元素追加到 path 中,然后将起点设置为当前位置,寻找当前位置之后的数字;
  3. 给一个空数组来存储结果子集,在经历过 help 函数执行的深度遍历之后,即可得到所有的子集。

方法二

  1. 按照数学思维来看,要想获取一个数组的所有子集,首先数组有一个子集是空数组,那么如果有一个元素时,是空数组加这一个元素组成的集合;
  2. 那么,我们可以在遍历数组时,每遇到数组中的一个元素就将该元素放入当前获取的子集中,然后再将形成的数组追加到结果数组中,这样在数组遍历完成后,我们也就得到了数字的所有子集。

AC 代码

方法一

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    const res = []
    const len = nums.length
    if (!len) return res
    const help = (path, start) => {
        res.push(path)
        for (let i = start; i < len; i++) {
            if (!path.includes(nums[i])) {
                help([...path, nums[i]], i)
            }
        }
    }
    // 空数组,从0开始
    help([], 0)
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:56 ms, 在所有 JavaScript 提交中击败了95.89%的用户
  • 内存消耗:43.1 MB, 在所有 JavaScript 提交中击败了26.03%的用户
  • 通过测试用例:10 / 10

方法二

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    let res = [[]]
    for(let i = 0; i < nums.length; i++){
        const tempRes = res.map(subset => {
            const one = subset.concat([])
            one.push(nums[i])
            return one
        })
        res = res.concat(tempRes)
    }
    return res
};

结果:

  • 执行结果:通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了87.67%的用户
  • 内存消耗:43.2 MB, 在所有 JavaScript 提交中击败了21.92%的用户
  • 通过测试用例:10 / 10

END