LeetCode 题解:78. 子集,递归回溯,JavaScript,详细注释

用户头像
Lee Chen
关注
发布于: 3 小时前
LeetCode题解:78. 子集,递归回溯,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/subsets/



解题思路:



  1. 使用DFS生成所有可能的排列情况。

  2. 所有的子集包括nums中的每个元素包含于不包含两种状态。

  3. 可以在递归下探到下一层之前,利用当前元素存入或不存入subset的状态进行区分。



function dfs(nums, subset, current, result) {
// 递归终止条件
// 由于每次进入递归时,current表示将要插入元素的位置
// 因此当current等于nums长度时,表示所有子集已被找到
if (current === nums.length) {
// subset必须被copy一份,否则会被清空
result.push(subset.slice());
return;
}
// 当前层递归逻辑
// 每层递归有两种结果,即是否存入元素
// 将当前索引的元素存入subset
subset.push(nums[current]);
// 计算下一层储存元素的索引
const newCurrent = current + 1;
// 保持当前元素被存储的状态,下探到下一层递归
dfs(nums, subset, newCurrent, result);
// 清理当前层状态
// 将当前层存入subset的元素弹出。
// 即表示不存入当前元素的子集。
subset.pop();
// 保持当前元素没有被存储的状态,下探到下一层递归
dfs(nums, subset, newCurrent, result);
}
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function (nums) {
let result = []; // 存储结果
let subset = []; // 存储每个子集
// 使用DFS+回溯生成所有子集
dfs(nums, subset, 0, result);
return result;
};



发布于: 3 小时前 阅读数: 4
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:78. 子集,递归回溯,JavaScript,详细注释