29
29
30
30
<!-- 这里可写通用的实现逻辑 -->
31
31
32
- 回溯法
32
+ ** 方法一:递归枚举**
33
+
34
+ 我们设计一个递归函数 $dfs(u, t)$,它的参数为当前枚举到的元素的下标 $u$,以及当前的子集 $t$。
35
+
36
+ 当前枚举到的元素下标为 $u$,我们可以选择将其加入子集 $t$ 中,也可以选择不加入子集 $t$ 中。递归这两种选择,即可得到所有的子集。
37
+
38
+ 时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。数组中每个元素有两种状态,即选择或不选择,共 $2^n$ 种状态,每种状态需要 $O(n)$ 的时间来构造子集。
39
+
40
+ ** 方法二:二进制枚举**
41
+
42
+ 我们可以将方法一中的递归过程改写成迭代的形式,即使用二进制枚举的方法来枚举所有的子集。
43
+
44
+ 我们可以使用 $2^n$ 个二进制数来表示 $n$ 个元素的所有子集,若某个二进制数 ` mask ` 的第 $i$ 位为 $1$,表示子集中包含数组第 $i$ 个元素 $v$;若为 $0$,表示子集中不包含数组第 $i$ 个元素 $v$。
45
+
46
+ 时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。一共有 $2^n$ 个子集,每个子集需要 $O(n)$ 的时间来构造。
33
47
34
48
<!-- tabs:start -->
35
49
@@ -44,27 +58,39 @@ class Solution:
44
58
if u == len (nums):
45
59
ans.append(t[:])
46
60
return
61
+ dfs(u + 1 , t)
47
62
t.append(nums[u])
48
63
dfs(u + 1 , t)
49
64
t.pop()
50
- dfs(u + 1 , t)
51
65
52
66
ans = []
53
67
dfs(0 , [])
54
68
return ans
55
69
```
56
70
71
+ ``` python
72
+ class Solution :
73
+ def subsets (self , nums : List[int ]) -> List[List[int ]]:
74
+ ans = []
75
+ for mask in range (1 << len (nums)):
76
+ t = []
77
+ for i, v in enumerate (nums):
78
+ if (mask >> i) & 1 :
79
+ t.append(v)
80
+ ans.append(t)
81
+ return ans
82
+ ```
83
+
57
84
### ** Java**
58
85
59
86
<!-- 这里可写当前语言的特殊实现逻辑 -->
60
87
61
88
``` java
62
89
class Solution {
63
- private List<List<Integer > > ans;
90
+ private List<List<Integer > > ans = new ArrayList<> () ;
64
91
private int [] nums;
65
92
66
93
public List<List<Integer > > subsets (int [] nums ) {
67
- ans = new ArrayList<> ();
68
94
this . nums = nums;
69
95
dfs(0 , new ArrayList<> ());
70
96
return ans;
@@ -75,36 +101,118 @@ class Solution {
75
101
ans. add(new ArrayList<> (t));
76
102
return ;
77
103
}
104
+ dfs(u + 1 , t);
78
105
t. add(nums[u]);
79
106
dfs(u + 1 , t);
80
107
t. remove(t. size() - 1 );
81
- dfs(u + 1 , t);
82
108
}
83
109
}
84
110
```
85
111
86
- ### ** JavaScript**
87
-
88
- ``` js
89
- /**
90
- * @param {number[]} nums
91
- * @return {number[][]}
92
- */
93
- var subsets = function (nums ) {
94
- let prev = [];
95
- let res = [];
96
- dfs (nums, 0 , prev, res);
97
- return res;
112
+ ``` java
113
+ class Solution {
114
+ public List<List<Integer > > subsets (int [] nums ) {
115
+ int n = nums. length;
116
+ List<List<Integer > > ans = new ArrayList<> ();
117
+ for (int mask = 0 ; mask < 1 << n; ++ mask) {
118
+ List<Integer > t = new ArrayList<> ();
119
+ for (int i = 0 ; i < n; ++ i) {
120
+ if (((mask >> i) & 1 ) == 1 ) {
121
+ t. add(nums[i]);
122
+ }
123
+ }
124
+ ans. add(t);
125
+ }
126
+ return ans;
127
+ }
128
+ }
129
+ ```
130
+
131
+ ### ** C++**
132
+
133
+ ``` cpp
134
+ class Solution {
135
+ public:
136
+ vector<vector<int >> subsets(vector<int >& nums) {
137
+ vector<vector<int >> ans;
138
+ vector<int > t;
139
+ dfs(0, nums, t, ans);
140
+ return ans;
141
+ }
142
+
143
+ void dfs(int u, vector<int>& nums, vector<int>& t, vector<vector<int>>& ans) {
144
+ if (u == nums.size()) {
145
+ ans.push_back(t);
146
+ return;
147
+ }
148
+ dfs (u + 1, nums, t, ans);
149
+ t.push_back(nums[ u] );
150
+ dfs(u + 1, nums, t, ans);
151
+ t.pop_back();
152
+ }
98
153
};
154
+ ```
99
155
100
- function dfs (nums , depth , prev , res ) {
101
- res .push (prev .slice ());
102
- for (let i = depth; i < nums .length ; i++ ) {
103
- prev .push (nums[i]);
104
- depth++ ;
105
- dfs (nums, depth, prev, res);
106
- prev .pop ();
156
+ ```cpp
157
+ class Solution {
158
+ public:
159
+ vector<vector<int>> subsets(vector<int>& nums) {
160
+ vector<vector<int>> ans;
161
+ vector<int> t;
162
+ int n = nums.size();
163
+ for (int mask = 0; mask < 1 << n; ++mask)
164
+ {
165
+ t.clear();
166
+ for (int i = 0; i < n; ++i)
167
+ {
168
+ if ((mask >> i) & 1)
169
+ {
170
+ t.push_back(nums[i]);
171
+ }
172
+ }
173
+ ans.push_back(t);
174
+ }
175
+ return ans;
107
176
}
177
+ };
178
+ ```
179
+
180
+ ### ** Go**
181
+
182
+ ``` go
183
+ func subsets (nums []int ) [][]int {
184
+ var ans [][]int
185
+ var dfs func (u int , t []int )
186
+ dfs = func (u int , t []int ) {
187
+ if u == len (nums) {
188
+ ans = append (ans, append ([]int (nil ), t...))
189
+ return
190
+ }
191
+ dfs (u+1 , t)
192
+ t = append (t, nums[u])
193
+ dfs (u+1 , t)
194
+ t = t[:len (t)-1 ]
195
+ }
196
+ var t []int
197
+ dfs (0 , t)
198
+ return ans
199
+ }
200
+ ```
201
+
202
+ ``` go
203
+ func subsets (nums []int ) [][]int {
204
+ var ans [][]int
205
+ n := len (nums)
206
+ for mask := 0 ; mask < 1 <<n; mask++ {
207
+ t := []int {}
208
+ for i , v := range nums {
209
+ if ((mask >> i) & 1 ) == 1 {
210
+ t = append (t, v)
211
+ }
212
+ }
213
+ ans = append (ans, t)
214
+ }
215
+ return ans
108
216
}
109
217
```
110
218
@@ -122,7 +230,7 @@ function subsets(nums: number[]): number[][] {
122
230
}
123
231
```
124
232
125
- ``` rust
233
+ ``` ts
126
234
function subsets(nums : number []): number [][] {
127
235
const n = nums .length ;
128
236
const res = [];
@@ -180,56 +288,6 @@ impl Solution {
180
288
}
181
289
```
182
290
183
- ### ** C++**
184
-
185
- ``` cpp
186
- class Solution {
187
- public:
188
- vector<vector<int >> subsets(vector<int >& nums) {
189
- vector<int > t;
190
- vector<vector<int >> ans;
191
- dfs(0, t, nums, ans);
192
- return ans;
193
- }
194
-
195
- void dfs(int u, vector<int>& t, vector<int>& nums, vector<vector<int>>& ans) {
196
- if (u == nums.size()) {
197
- ans.push_back(t);
198
- return;
199
- }
200
- t.push_back(nums[u]);
201
- dfs (u + 1, t, nums, ans);
202
- t.pop_back();
203
- dfs(u + 1, t, nums, ans);
204
- }
205
- };
206
- ```
207
-
208
- ### **Go**
209
-
210
- ```go
211
- func subsets(nums []int) [][]int {
212
- var ans [][]int
213
- var dfs func(u int, t []int)
214
- dfs = func(u int, t []int) {
215
- if u == len(nums) {
216
- cp := make([]int, len(t))
217
- copy(cp, t)
218
- ans = append(ans, cp)
219
- return
220
- }
221
- t = append(t, nums[u])
222
- dfs(u+1, t)
223
- t = t[:len(t)-1]
224
- dfs(u+1, t)
225
-
226
- }
227
- var t []int
228
- dfs(0, t)
229
- return ans
230
- }
231
- ```
232
-
233
291
### ** ...**
234
292
235
293
```
0 commit comments