问题描述:
子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv67o6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分析:
画个草图:
解法:
var backtrack = function(list, tmpList, nums, start) { const len = nums.length; if(start === len) { return; } for(let i=start; i<len; i++) { tmpList.push(nums[i]); list.push([...tmpList]); for(let j=i+1;j<len;j++) { tmpList.push(nums[j]); list.push([...tmpList]); backtrack(list, tmpList, nums, j+1); tmpList.pop(); } tmpList.pop(); } }; /** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { var len = nums.length; if(len === 0) return [[]]; var list = [[]]; backtrack(list, [], nums, 0); return list; };
改进版:
var backtrack = function(list, tmpList, nums) { const len = nums.length; if(0 === len) { return; } for(let i=0; i<len; i++) { tmpList.push(nums[i]); list.push([...tmpList]); backtrack(list, tmpList, nums.slice(i+1)); tmpList.pop(); } }; /** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { var len = nums.length; if(len === 0) return [[]]; var list = [[]]; backtrack(list, [], nums); return list; };