Skip to content

Commit 4afd410

Browse files
committed
feat: add solutions to lc/lcci problems
* lcci No.08.04 & lc No.0078.Subsets
1 parent 78e8195 commit 4afd410

File tree

8 files changed

+276
-169
lines changed

8 files changed

+276
-169
lines changed

lcci/08.04.Power Set/README.md

+133-75
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,21 @@
2929

3030
<!-- 这里可写通用的实现逻辑 -->
3131

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

3448
<!-- tabs:start -->
3549

@@ -44,27 +58,39 @@ class Solution:
4458
if u == len(nums):
4559
ans.append(t[:])
4660
return
61+
dfs(u + 1, t)
4762
t.append(nums[u])
4863
dfs(u + 1, t)
4964
t.pop()
50-
dfs(u + 1, t)
5165

5266
ans = []
5367
dfs(0, [])
5468
return ans
5569
```
5670

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+
5784
### **Java**
5885

5986
<!-- 这里可写当前语言的特殊实现逻辑 -->
6087

6188
```java
6289
class Solution {
63-
private List<List<Integer>> ans;
90+
private List<List<Integer>> ans = new ArrayList<>();
6491
private int[] nums;
6592

6693
public List<List<Integer>> subsets(int[] nums) {
67-
ans = new ArrayList<>();
6894
this.nums = nums;
6995
dfs(0, new ArrayList<>());
7096
return ans;
@@ -75,36 +101,118 @@ class Solution {
75101
ans.add(new ArrayList<>(t));
76102
return;
77103
}
104+
dfs(u + 1, t);
78105
t.add(nums[u]);
79106
dfs(u + 1, t);
80107
t.remove(t.size() - 1);
81-
dfs(u + 1, t);
82108
}
83109
}
84110
```
85111

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+
}
98153
};
154+
```
99155
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;
107176
}
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
108216
}
109217
```
110218

@@ -122,7 +230,7 @@ function subsets(nums: number[]): number[][] {
122230
}
123231
```
124232

125-
```rust
233+
```ts
126234
function subsets(nums: number[]): number[][] {
127235
const n = nums.length;
128236
const res = [];
@@ -180,56 +288,6 @@ impl Solution {
180288
}
181289
```
182290

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-
233291
### **...**
234292

235293
```

0 commit comments

Comments
 (0)