78.subsets.md 3.7 KB
Newer Older
Y
yulecc 已提交
1
## 题目地址(78. 子集)
L
lucifer 已提交
2

Y
yulecc 已提交
3
https://leetcode-cn.com/problems/subsets/
L
luzhipeng 已提交
4 5

## 题目描述
L
lucifer 已提交
6

L
luzhipeng 已提交
7
```
Y
yulecc 已提交
8
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
L
luzhipeng 已提交
9

Y
yulecc 已提交
10
说明:解集不能包含重复的子集。
L
luzhipeng 已提交
11

Y
yulecc 已提交
12
示例:
L
luzhipeng 已提交
13

Y
yulecc 已提交
14 15
输入: nums = [1,2,3]
输出:
L
luzhipeng 已提交
16
[
L
luzhipeng 已提交
17
  [3],
Y
yulecc 已提交
18 19 20 21 22 23 24
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
L
luzhipeng 已提交
25 26 27 28
]

```

L
lucifer 已提交
29 30
## 前置知识

L
lucifer 已提交
31
- [回溯](https://github.com/azl397985856/leetcode/blob/master/thinkings/backtrack.md)
L
lucifer 已提交
32

33 34 35 36 37 38 39
## 公司

- 阿里
- 腾讯
- 百度
- 字节

L
luzhipeng 已提交
40 41
## 思路

L
lucifer 已提交
42 43
回溯的基本思路清参考上方的回溯专题。

L
lucifer 已提交
44
子集类题目和全排列题目不一样的点在于其需要在递归树的所有节点执行**加入结果集** 这一操作,而不像全排列需要在叶子节点执行**加入结果集**
L
luzhipeng 已提交
45 46 47 48 49 50 51 52

## 关键点解析

- 回溯法
- backtrack 解题公式

## 代码

z2014z's avatar
z2014z 已提交
53
- 语言支持:JS,C++,Java,Python
54 55

JavaScript Code:
L
luzhipeng 已提交
56

L
lucifer 已提交
57
```js
L
luzhipeng 已提交
58
function backtrack(list, tempList, nums, start) {
L
lucifer 已提交
59 60 61 62 63 64
  list.push([...tempList]);
  for (let i = start; i < nums.length; i++) {
    tempList.push(nums[i]);
    backtrack(list, tempList, nums, i + 1);
    tempList.pop();
  }
L
luzhipeng 已提交
65 66 67 68 69
}
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
L
lucifer 已提交
70 71 72 73
var subsets = function (nums) {
  const list = [];
  backtrack(list, [], nums, 0);
  return list;
L
luzhipeng 已提交
74 75
};
```
L
lucifer 已提交
76

77
C++ Code:
L
lucifer 已提交
78

79 80 81 82 83 84 85 86 87
```C++
class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        auto ret = vector<vector<int>>();
        auto tmp = vector<int>();
        backtrack(ret, tmp, nums, 0);
        return ret;
    }
L
lucifer 已提交
88

89 90 91 92 93 94 95 96 97 98
    void backtrack(vector<vector<int>>& list, vector<int>& tempList, vector<int>& 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();
        }
    }
};
```
L
luzhipeng 已提交
99

z2014z's avatar
z2014z 已提交
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
Java Code:

```java
class Solution {
    // 结果
    List<List<Integer>> res = new ArrayList();
    public List<List<Integer>> subsets(int[] nums) {
        backtrack(nums, 0, new ArrayList<Integer>());
        return res;
    }

    public void backtrack(int[] nums, int start, ArrayList<Integer> track)
    {
        // 注意:深拷贝
        res.add(new ArrayList(track));
        for(int i=start; i<nums.length;i++)
        {
            // 做选择
            track.add(nums[i]);
            // 回溯
            backtrack(nums, i+1, track);
            // 撤销选择
            track.remove(track.size()-1);
        }
    }
}
```

python Code:

```py
class Solution:
    def subsets(self, nums):
        self.res = []
        self.track = []
        self.backtrack(nums, 0, self.track)

        return self.res

    def backtrack(self, nums, start, track):
        # 注意深拷贝
        self.res.append(list(self.track))
        for i in range(start, len(nums)):
            # 做选择
            self.track.append(nums[i])
            # 回溯
            self.backtrack(nums, i+1, self.track)
            # 撤销选择
            self.track.pop()
```

L
luzhipeng 已提交
151 152 153 154 155 156 157
## 相关题目

- [39.combination-sum](./39.combination-sum.md)
- [40.combination-sum-ii](./40.combination-sum-ii.md)
- [46.permutations](./46.permutations.md)
- [47.permutations-ii](./47.permutations-ii.md)
- [90.subsets-ii](./90.subsets-ii.md)
L
luzhipeng 已提交
158
- [113.path-sum-ii](./113.path-sum-ii.md)
L
luzhipeng 已提交
159
- [131.palindrome-partitioning](./131.palindrome-partitioning.md)
L
lucifer 已提交
160 161 162 163

大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)