携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 20 天,点击查看活动详情
幂集
原题地址
幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路分析
方法一
- 题目中需要获取一个数组中所有的子集,需要定义一个辅助函数,来对数组进行深度遍历;
- 定义
help方法,接收两个入参,path表示深度遍历过程中的数组,start表示深度遍历的起点,那么首先将path本身放入结果集中,另外,如果当前的元素不在path中,那么将当前元素追加到path中,然后将起点设置为当前位置,寻找当前位置之后的数字; - 给一个空数组来存储结果子集,在经历过
help函数执行的深度遍历之后,即可得到所有的子集。
方法二
- 按照数学思维来看,要想获取一个数组的所有子集,首先数组有一个子集是空数组,那么如果有一个元素时,是空数组加这一个元素组成的集合;
- 那么,我们可以在遍历数组时,每遇到数组中的一个元素就将该元素放入当前获取的子集中,然后再将形成的数组追加到结果数组中,这样在数组遍历完成后,我们也就得到了数字的所有子集。
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