一、题目描述:
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
****示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
二、思路分析:
- dfs回溯
- 两种思路
- 1.逐个考察数字,每个数都选或不选
- 2.枚举当前只选一个数有哪几种情况,选两个数有几种情况
- 两种思路都是先画出树,只是画树的方式不同
三、AC 代码:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
const res = []
const subset = []
const dfs = (index,subset)=>{
if(index === nums.length){
res.push(subset)
return
}
dfs(index+1,subset.slice())
subset.push(nums[index])
dfs(index+1,subset.slice())
}
dfs(0,[])
return res
};
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
const res = []
const subset = []
const dfs = (index)=>{
res.push(subset.slice())
for(let i=index;i<nums.length;i++){
subset.push(nums[i])
dfs(i+1)
subset.pop()
}
}
dfs(0)
return res
};
四、总结:
- 若是下一种状态基于当前状态,则枚举下一种状态,将合适的解记录
- 画出递归树有助于编码
- JavaScript的函数参数传递,数组类型是引用传递,要注意。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情