Open
Description
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
求子集,其实可以转化为在数组中,求长度从 1 ~ nums.length
的每种长度下的全部组合。
那么定义 helper
函数,接受的参数为 start
起点, prev
之前拼成的数组,targetLength
目标长度。在这个递归过程中,目标长度是不变的。只需要 prev
的长度和 targetLength
相等,即可完成一个结果放入 res
数组中。
最后,针对 targetLength
为 1 ~ nums.length
,分别调用 helper
函数即可:
/**
* @param {number[]} nums
* @return {number[][]}
*/
let subsets = function (nums) {
let res = []
let n = nums.length
if (n === 0) {
return res
}
let helper = (start, prev, targetLength) => {
if (start > n) {
return
}
if (prev.length === targetLength) {
res.push(prev)
return
}
for (let i = start; i < n; i++) {
let cur = nums[i]
helper(i + 1, prev.concat(cur), targetLength)
}
}
for (let j = 1; j <= nums.length; j++) {
helper(0, [], j)
}
return [[], ...res]
}