题目链接:78. 子集
题目描述
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
文章讲解:代码随想录
视频讲解:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili
题解1:回溯法
思路:使用回溯法来求解子集类问题。
回溯分析:
- 递归函数的参数和返回值:首先创建2个变量 res 和 path,path 记录遍历的路径,res 记录结果。递归函数的返回值为 void,参数是 start,用来记录本次递归的开始位置。
- 递归函数的终止条件:找到叶子节点,即 start 和 nums.length 相同,也就是查找完毕。
- 单层递归的逻辑:将当前路径作为子集记录到结果数组中,使用 for 循环从开始位置 start 开始直到 nums.length 横向遍历,递归的向下纵向遍历寻找组合。
- 剪枝:无。
/*** @param {number[]} nums* @return {number[][]}*/
var subsets = function(nums) {const res = []; // 结果数组const path = []; // 路径const backtracking = function (start) {res.push([...path]); // 将节点的值记录进结果数组for (let i = start; i < nums.length; i++) {path.push(nums[i]); // 记录路径backtracking(i + 1); // 向下查找path.pop(); // 回溯}}backtracking(0);return res;
};
分析:时间复杂度为 O(n * 2 ^ n),空间复杂度为 O(n)。
收获
学习了使用回溯法求解子集问题,收集结果在所有节点上都需要进行。