题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1:
输入: nums = [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入: nums = [0]
输出: [[],[0]]
思路
- 画出抽象树结构
-
由抽象树,我们可以看出,我们所需要的结果是
每层递归的结果,这也是本题与组合,组合总和,切割(它们需要的结果是叶子节点的结果)问题的区别。 -
回溯三部曲:
- 传参:nums:数组,startIndex:每次递归遍历开始的位置;返回值:void
- 终止条件:startIndex==nums.length
- 单层递归逻辑
代码
function subsets(nums: number[]): number[][] {
let result=[],path=[];//结果数组,路径数组
result.push([]);
function backTracking(nums: number[],startIndex:number): void{
//终止条件
if(startIndex==nums.length){
return;
}
for(let i=startIndex;i<nums.length;i++){
path.push(nums[i]);
result.push([...path]); //收割每层递归结果
backTracking(nums,i+1);
path.pop(); // 回溯操作
}
}
backTracking(nums,0)
return result;
};
总结
组合,组合总和,切割,子集问题首先想到回溯算法。但子集问题,需要收割的是每层递归的结果。