40
40
41
41
<!-- 这里可写通用的实现逻辑 -->
42
42
43
- ** 方法一:递归枚举 **
43
+ ** 方法一:DFS(回溯) **
44
44
45
- 我们设计一个递归函数 $dfs(u, t )$,它的参数为当前枚举到的元素的下标 $u$,以及当前的子集 $t$。
45
+ 我们设计一个函数 $dfs(i )$,表示从数组的第 $i$ 个元素开始搜索所有子集。函数 $dfs(i)$ 的执行逻辑如下:
46
46
47
- 当前枚举到的元素下标为 $u$,我们可以选择将其加入子集 $t$ 中,也可以选择不加入子集 $t$ 中。递归这两种选择,即可得到所有的子集。
47
+ - 如果 $i=n$,表示当前已经搜索结束,将当前得到的子集 $t$ 加入答案数组 $ans$ 中,然后返回;
48
+ - 否则,我们可以选择不选择当前元素,直接执行 $dfs(i+1)$;也可以选择当前元素,即把当前元素 $nums[ i] $ 加入子集 $t$,然后执行 $dfs(i+1)$,注意要在执行 $dfs(i+1)$ 以后再将 $nums[ i] $ 从子集 $t$ 中移除(回溯)。
48
49
49
- 时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。数组中每个元素有两种状态,即选择或不选择,共 $2^n$ 种状态,每种状态需要 $O(n)$ 的时间来构造子集。
50
+ 在主函数中,我们调用 $dfs(0)$,即从数组的第一个元素开始搜索所有子集。最后返回答案数组 $ans$ 即可。
51
+
52
+ 时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。一共有 $2^n$ 个子集,每个子集需要 $O(n)$ 的时间来构造。
50
53
51
54
** 方法二:二进制枚举**
52
55
53
- 我们可以将方法一中的递归过程改写成迭代的形式,即使用二进制枚举的方法来枚举所有的子集 。
56
+ 我们也可以使用二进制枚举的方法得到所有的子集 。
54
57
55
- 我们可以使用 $2^n$ 个二进制数来表示 $n$ 个元素的所有子集,若某个二进制数 ` mask ` 的第 $i$ 位为 $1$,表示子集中包含数组第 $i$ 个元素 $v$;若为 $0$,表示子集中不包含数组第 $i$ 个元素 $v$ 。
58
+ 我们可以使用 $2^n$ 个二进制数来表示 $n$ 个元素的所有子集,对于当前二进制数 $ mask$,如果第 $i$ 位为 $1$,表示选择了第 $i$ 个元素,否则表示不选择第 $i$ 个元素。
56
59
57
60
时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。一共有 $2^n$ 个子集,每个子集需要 $O(n)$ 的时间来构造。
58
61
65
68
``` python
66
69
class Solution :
67
70
def subsets (self , nums : List[int ]) -> List[List[int ]]:
68
- def dfs (u , t ):
69
- if u == len (nums):
71
+ def dfs (i : int ):
72
+ if i == len (nums):
70
73
ans.append(t[:])
71
74
return
72
- dfs(u + 1 , t )
73
- t.append(nums[u ])
74
- dfs(u + 1 , t )
75
+ dfs(i + 1 )
76
+ t.append(nums[i ])
77
+ dfs(i + 1 )
75
78
t.pop()
76
79
77
80
ans = []
78
- dfs(0 , [])
81
+ t = []
82
+ dfs(0 )
79
83
return ans
80
84
```
81
85
@@ -84,10 +88,7 @@ class Solution:
84
88
def subsets (self , nums : List[int ]) -> List[List[int ]]:
85
89
ans = []
86
90
for mask in range (1 << len (nums)):
87
- t = []
88
- for i, v in enumerate (nums):
89
- if (mask >> i) & 1 :
90
- t.append(v)
91
+ t = [x for i, x in enumerate (nums) if mask >> i & 1 ]
91
92
ans.append(t)
92
93
return ans
93
94
```
@@ -99,22 +100,23 @@ class Solution:
99
100
``` java
100
101
class Solution {
101
102
private List<List<Integer > > ans = new ArrayList<> ();
103
+ private List<Integer > t = new ArrayList<> ();
102
104
private int [] nums;
103
105
104
106
public List<List<Integer > > subsets (int [] nums ) {
105
107
this . nums = nums;
106
- dfs(0 , new ArrayList<> () );
108
+ dfs(0 );
107
109
return ans;
108
110
}
109
111
110
- private void dfs (int u , List< Integer > t ) {
111
- if (u == nums. length) {
112
+ private void dfs (int i ) {
113
+ if (i == nums. length) {
112
114
ans. add(new ArrayList<> (t));
113
115
return ;
114
116
}
115
- dfs(u + 1 , t );
116
- t. add(nums[u ]);
117
- dfs(u + 1 , t );
117
+ dfs(i + 1 );
118
+ t. add(nums[i ]);
119
+ dfs(i + 1 );
118
120
t. remove(t. size() - 1 );
119
121
}
120
122
}
@@ -147,41 +149,36 @@ public:
147
149
vector<vector<int >> subsets(vector<int >& nums) {
148
150
vector<vector<int >> ans;
149
151
vector<int > t;
150
- dfs(0, nums, t, ans);
152
+ function<void(int)> dfs = [ &] (int i) -> void {
153
+ if (i == nums.size()) {
154
+ ans.push_back(t);
155
+ return;
156
+ }
157
+ dfs(i + 1);
158
+ t.push_back(nums[ i] );
159
+ dfs(i + 1);
160
+ t.pop_back();
161
+ };
162
+ dfs(0);
151
163
return ans;
152
164
}
153
-
154
- void dfs(int u, vector<int>& nums, vector<int>& t, vector<vector<int>>& ans) {
155
- if (u == nums.size()) {
156
- ans.push_back(t);
157
- return;
158
- }
159
- dfs (u + 1, nums, t, ans);
160
- t.push_back(nums[ u] );
161
- dfs(u + 1, nums, t, ans);
162
- t.pop_back();
163
- }
164
165
};
165
166
```
166
167
167
168
```cpp
168
169
class Solution {
169
170
public:
170
171
vector<vector<int>> subsets(vector<int>& nums) {
171
- vector<vector<int>> ans;
172
- vector<int> t;
173
172
int n = nums.size();
174
- for (int mask = 0; mask < 1 << n; ++mask)
175
- {
176
- t.clear();
177
- for (int i = 0; i < n; ++i)
178
- {
179
- if ((mask >> i) & 1)
180
- {
181
- t.push_back(nums[i]);
173
+ vector<vector<int>> ans;
174
+ for (int mask = 0; mask < 1 << n; ++mask) {
175
+ vector<int> t;
176
+ for (int i = 0; i < n; ++i) {
177
+ if (mask >> i & 1) {
178
+ t.emplace_back(nums[i]);
182
179
}
183
180
}
184
- ans.push_back (t);
181
+ ans.emplace_back (t);
185
182
}
186
183
return ans;
187
184
}
@@ -191,52 +188,49 @@ public:
191
188
### ** Go**
192
189
193
190
``` go
194
- func subsets (nums []int ) [][]int {
195
- var ans [][] int
196
- var dfs func (u int , t [] int )
197
- dfs = func (u int , t [] int ) {
198
- if u == len (nums) {
191
+ func subsets (nums []int ) ( ans [][]int ) {
192
+ t := []int {}
193
+ var dfs func (int )
194
+ dfs = func (i int ) {
195
+ if i == len (nums) {
199
196
ans = append (ans, append ([]int (nil ), t...))
200
197
return
201
198
}
202
- dfs (u+ 1 , t )
203
- t = append (t, nums[u ])
204
- dfs (u+ 1 , t )
199
+ dfs (i + 1 )
200
+ t = append (t, nums[i ])
201
+ dfs (i + 1 )
205
202
t = t[:len (t)-1 ]
206
203
}
207
- var t []int
208
- dfs (0 , t)
209
- return ans
204
+ dfs (0 )
205
+ return
210
206
}
211
207
```
212
208
213
209
``` go
214
- func subsets (nums []int ) [][]int {
215
- var ans [][]int
210
+ func subsets (nums []int ) (ans [][]int ) {
216
211
n := len (nums)
217
212
for mask := 0 ; mask < 1 <<n; mask++ {
218
213
t := []int {}
219
- for i , v := range nums {
220
- if (( mask >> i) & 1 ) == 1 {
221
- t = append (t, v )
214
+ for i , x := range nums {
215
+ if mask>>i& 1 == 1 {
216
+ t = append (t, x )
222
217
}
223
218
}
224
219
ans = append (ans, t)
225
220
}
226
- return ans
221
+ return
227
222
}
228
223
```
229
224
230
225
### ** TypeScript**
231
226
232
227
``` ts
233
228
function subsets(nums : number []): number [][] {
234
- const n = nums . length ;
229
+ const ans : number [][] = [] ;
235
230
const t: number [] = [];
236
- const res: number [][] = [];
237
231
const dfs = (i : number ) => {
238
- if (i === n ) {
239
- res .push ([ ... t ] );
232
+ if (i === nums . length ) {
233
+ ans .push (t . slice () );
240
234
return ;
241
235
}
242
236
dfs (i + 1 );
@@ -245,7 +239,24 @@ function subsets(nums: number[]): number[][] {
245
239
t .pop ();
246
240
};
247
241
dfs (0 );
248
- return res ;
242
+ return ans ;
243
+ }
244
+ ```
245
+
246
+ ``` ts
247
+ function subsets(nums : number []): number [][] {
248
+ const n = nums .length ;
249
+ const ans: number [][] = [];
250
+ for (let mask = 0 ; mask < 1 << n ; ++ mask ) {
251
+ const t: number [] = [];
252
+ for (let i = 0 ; i < n ; ++ i ) {
253
+ if (((mask >> i ) & 1 ) === 1 ) {
254
+ t .push (nums [i ]);
255
+ }
256
+ }
257
+ ans .push (t );
258
+ }
259
+ return ans ;
249
260
}
250
261
```
251
262
0 commit comments