## 题目地址(78. 子集) https://leetcode-cn.com/problems/subsets/ ## 题目描述 ``` 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   [2],   [1,2,3],   [1,3],   [2,3],   [1,2],   [] ] ``` ## 前置知识 - [回溯](https://github.com/azl397985856/leetcode/blob/master/thinkings/backtrack.md) ## 公司 - 阿里 - 腾讯 - 百度 - 字节 ## 思路 回溯的基本思路清参考上方的回溯专题。 子集类题目和全排列题目不一样的点在于其需要在递归树的所有节点执行**加入结果集** 这一操作,而不像全排列需要在叶子节点执行**加入结果集**。 ## 关键点解析 - 回溯法 - backtrack 解题公式 ## 代码 - 语言支持:JS,C++,Java,Python JavaScript Code: ```js function backtrack(list, tempList, nums, start) { list.push([...tempList]); for (let i = start; i < nums.length; i++) { tempList.push(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.pop(); } } /** * @param {number[]} nums * @return {number[][]} */ var subsets = function (nums) { const list = []; backtrack(list, [], nums, 0); return list; }; ``` C++ Code: ```C++ class Solution { public: vector> subsets(vector& nums) { auto ret = vector>(); auto tmp = vector(); backtrack(ret, tmp, nums, 0); return ret; } void backtrack(vector>& list, vector& tempList, vector& nums, int start) { list.push_back(tempList); for (auto i = start; i < nums.size(); ++i) { tempList.push_back(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.pop_back(); } } }; ``` Java Code: ```java class Solution { // 结果 List> res = new ArrayList(); public List> subsets(int[] nums) { backtrack(nums, 0, new ArrayList()); return res; } public void backtrack(int[] nums, int start, ArrayList track) { // 注意:深拷贝 res.add(new ArrayList(track)); for(int i=start; i