题目
解题思路
- 这类题可以使用一个模板解决,递归思想
- 模板的思路如下
var subsets = function(nums) {
const result = [];
function backtrack(start, curr) {
result.push([...curr]);
for (let i = start; i < nums.length; i++) {
// 1、把nums[i]加入curr数组
curr.push(nums[i]);
// 2、递归调用
backtrack(i + 1, curr);
// 3、把curr数组的最后一个元素移除(这一步会等第一轮递归结束后再执行)
curr.pop();
}
console.log(result)
}
backtrack(0, [])
return result;
};
- 以[1,2,3]为例,执行backtrack(0,[])让递归函数运行起来
- 注意移除最后一个元素是等第一轮递归结束后执行的,移除后继续执行循环体的代码。
5. 通过树结构解析:
JavaScript代码
var subsets = function(nums) {
const result = [];
function backtrack(start, curr) {
result.push([...curr]);
for (let i = start; i < nums.length; i++) {
// 1、把nums[i]加入curr数组
curr.push(nums[i]);
// 2、递归调用
backtrack(i + 1, curr);
// 3、把curr数组的最后一个元素移除
curr.pop();
}
console.log(result)
}
backtrack(0, [])
return result;
};
类似题
第90题,在本题的基础上添加一个判断条件去除重复子集即可。
var subsetsWithDup = function(nums) {
const result = [];
// 先排序
nums.sort((a, b) => a - b)
function backtrack(start, curr) {
result.push([...curr]);
for (let i = start; i < nums.length; i++) {
if (i > start && nums[i] === nums[i - 1]) {
// 去掉重复项
continue;
}
curr.push(nums[i]);
backtrack(i + 1, curr)
curr.pop()
}
}
backtrack(0, [])
return result;
};