Skip to content

Commit 2a39d36

Browse files
committed
feat: add solutions to lc problem: No.0078
No.0078.Subsets
1 parent 9d18749 commit 2a39d36

File tree

10 files changed

+190
-172
lines changed

10 files changed

+190
-172
lines changed

solution/0000-0099/0078.Subsets/README.md

+78-67
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,22 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43-
**方法一:递归枚举**
43+
**方法一:DFS(回溯)**
4444

45-
我们设计一个递归函数 $dfs(u, t)$,它的参数为当前枚举到的元素的下标 $u$,以及当前的子集 $t$。
45+
我们设计一个函数 $dfs(i)$,表示从数组的第 $i$ 个元素开始搜索所有子集。函数 $dfs(i)$ 的执行逻辑如下:
4646

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$ 中移除(回溯)。
4849

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)$ 的时间来构造。
5053

5154
**方法二:二进制枚举**
5255

53-
我们可以将方法一中的递归过程改写成迭代的形式,即使用二进制枚举的方法来枚举所有的子集
56+
我们也可以使用二进制枚举的方法得到所有的子集
5457

55-
我们可以使用 $2^n$ 个二进制数来表示 $n$ 个元素的所有子集,若某个二进制数 `mask` 的第 $i$ 位为 $1$,表示子集中包含数组第 $i$ 个元素 $v$;若为 $0$,表示子集中不包含数组第 $i$ 个元素 $v$
58+
我们可以使用 $2^n$ 个二进制数来表示 $n$ 个元素的所有子集,对于当前二进制数 $mask$,如果第 $i$ 位为 $1$,表示选择了第 $i$ 个元素,否则表示不选择第 $i$ 个元素。
5659

5760
时间复杂度 $O(n\times 2^n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。一共有 $2^n$ 个子集,每个子集需要 $O(n)$ 的时间来构造。
5861

@@ -65,17 +68,18 @@
6568
```python
6669
class Solution:
6770
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):
7073
ans.append(t[:])
7174
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)
7578
t.pop()
7679

7780
ans = []
78-
dfs(0, [])
81+
t = []
82+
dfs(0)
7983
return ans
8084
```
8185

@@ -84,10 +88,7 @@ class Solution:
8488
def subsets(self, nums: List[int]) -> List[List[int]]:
8589
ans = []
8690
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]
9192
ans.append(t)
9293
return ans
9394
```
@@ -99,22 +100,23 @@ class Solution:
99100
```java
100101
class Solution {
101102
private List<List<Integer>> ans = new ArrayList<>();
103+
private List<Integer> t = new ArrayList<>();
102104
private int[] nums;
103105

104106
public List<List<Integer>> subsets(int[] nums) {
105107
this.nums = nums;
106-
dfs(0, new ArrayList<>());
108+
dfs(0);
107109
return ans;
108110
}
109111

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) {
112114
ans.add(new ArrayList<>(t));
113115
return;
114116
}
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);
118120
t.remove(t.size() - 1);
119121
}
120122
}
@@ -147,41 +149,36 @@ public:
147149
vector<vector<int>> subsets(vector<int>& nums) {
148150
vector<vector<int>> ans;
149151
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);
151163
return ans;
152164
}
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-
}
164165
};
165166
```
166167
167168
```cpp
168169
class Solution {
169170
public:
170171
vector<vector<int>> subsets(vector<int>& nums) {
171-
vector<vector<int>> ans;
172-
vector<int> t;
173172
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]);
182179
}
183180
}
184-
ans.push_back(t);
181+
ans.emplace_back(t);
185182
}
186183
return ans;
187184
}
@@ -191,52 +188,49 @@ public:
191188
### **Go**
192189

193190
```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) {
199196
ans = append(ans, append([]int(nil), t...))
200197
return
201198
}
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)
205202
t = t[:len(t)-1]
206203
}
207-
var t []int
208-
dfs(0, t)
209-
return ans
204+
dfs(0)
205+
return
210206
}
211207
```
212208

213209
```go
214-
func subsets(nums []int) [][]int {
215-
var ans [][]int
210+
func subsets(nums []int) (ans [][]int) {
216211
n := len(nums)
217212
for mask := 0; mask < 1<<n; mask++ {
218213
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)
222217
}
223218
}
224219
ans = append(ans, t)
225220
}
226-
return ans
221+
return
227222
}
228223
```
229224

230225
### **TypeScript**
231226

232227
```ts
233228
function subsets(nums: number[]): number[][] {
234-
const n = nums.length;
229+
const ans: number[][] = [];
235230
const t: number[] = [];
236-
const res: number[][] = [];
237231
const dfs = (i: number) => {
238-
if (i === n) {
239-
res.push([...t]);
232+
if (i === nums.length) {
233+
ans.push(t.slice());
240234
return;
241235
}
242236
dfs(i + 1);
@@ -245,7 +239,24 @@ function subsets(nums: number[]): number[][] {
245239
t.pop();
246240
};
247241
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;
249260
}
250261
```
251262

0 commit comments

Comments
 (0)