var subsets = function (nums) { let n = nums.length; let res = []; // 结果数组 // 这里的tmpPath是前一次的子集 往该子集插入新的元素 生成新的子集 // start 是前一次子集的长度 也是当前要求集合的长度-1 let backtrack = (tmpPath, start) => { res.push(tmpPath); // 每次进入函数 把当前tmp放入到结果res中 for (let i = start; i < n; i++) { // 根据start确定 下一个要放入tmpPath中的是哪一项 // 例如 当tmpPath = [1,2] 时, start = 2 则要从 nums的下标为2的项开始 也就是3 放入tmp中 // 形成下一次递归用的tmp=[123], start+1 // 递归backtrack 把[123]放入res中 start=3 for循环中找到的是第三项也就是4 形成[1234] 再递归 // 递归将[1234]放入res中 递归结束 删掉4 退回上一次递归 // 3处理完 把3删掉 i++从2 => 3 这次要放入的是4形成[124]。。。 tmpPath.push(nums[i]); backtrack(tmpPath.slice(), i + 1); tmpPath.pop(); } } backtrack([], 0); return res; };
原文:https://www.cnblogs.com/lanpang9661/p/13261829.html