Skip to content

Commit 591c435

Browse files
committed
feat: update solutions to lc problems: No.0078,0090
* No.0078.Subsets * No.0090.Subsets II
1 parent 499fd5f commit 591c435

File tree

12 files changed

+352
-240
lines changed

12 files changed

+352
-240
lines changed

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

+49-66
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,6 @@
4040

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

43-
回溯法的基本模板:
44-
45-
```py
46-
res = []
47-
path = []
48-
49-
def backtrack(未探索区域, res, path):
50-
if path 满足条件:
51-
res.add(path) # 深度拷贝
52-
# return # 如果不用继续搜索需要 return
53-
for 选择 in 未探索区域当前可能的选择:
54-
if 当前选择符合要求:
55-
path.add(当前选择)
56-
backtrack(新的未探索区域, res, path)
57-
path.pop()
58-
```
59-
6043
<!-- tabs:start -->
6144

6245
### **Python3**
@@ -66,19 +49,18 @@ def backtrack(未探索区域, res, path):
6649
```python
6750
class Solution:
6851
def subsets(self, nums: List[int]) -> List[List[int]]:
69-
res = []
70-
71-
def dfs(i, n, t):
72-
res.append(t.copy())
73-
if i == n:
52+
def dfs(u, t):
53+
if u == len(nums):
54+
ans.append(t[:])
7455
return
75-
for j in range(i, n):
76-
t.append(nums[j])
77-
dfs(j + 1, n, t)
78-
t.pop()
79-
80-
dfs(0, len(nums), [])
81-
return res
56+
dfs(u + 1, t)
57+
t.append(nums[u])
58+
dfs(u + 1, t)
59+
t.pop()
60+
61+
ans = []
62+
dfs(0, [])
63+
return ans
8264
```
8365

8466
### **Java**
@@ -87,22 +69,25 @@ class Solution:
8769

8870
```java
8971
class Solution {
72+
private List<List<Integer>> ans;
73+
private int[] nums;
74+
9075
public List<List<Integer>> subsets(int[] nums) {
91-
List<List<Integer>> res = new ArrayList<>();
92-
dfs(0, nums, new ArrayList<>(), res);
93-
return res;
76+
ans = new ArrayList<>();
77+
this.nums = nums;
78+
dfs(0, new ArrayList<>());
79+
return ans;
9480
}
9581

96-
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
97-
res.add(new ArrayList<>(t));
98-
if (i == nums.length) {
82+
private void dfs(int u, List<Integer> t) {
83+
if (u == nums.length) {
84+
ans.add(new ArrayList<>(t));
9985
return;
10086
}
101-
for (int j = i; j < nums.length; ++j) {
102-
t.add(nums[j]);
103-
dfs(j + 1, nums, t, res);
104-
t.remove(t.size() - 1);
105-
}
87+
dfs(u + 1, t);
88+
t.add(nums[u]);
89+
dfs(u + 1, t);
90+
t.remove(t.size() - 1);
10691
}
10792
}
10893
```
@@ -113,21 +98,22 @@ class Solution {
11398
class Solution {
11499
public:
115100
vector<vector<int>> subsets(vector<int>& nums) {
116-
vector<vector<int>> res;
101+
vector<vector<int>> ans;
117102
vector<int> t;
118-
dfs(0, nums, t, res);
119-
return res;
103+
dfs(0, nums, t, ans);
104+
return ans;
120105
}
121106

122-
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
123-
res.push_back(t);
124-
if (i == nums.size()) return;
125-
for (int j = i; j < nums.size(); ++j)
107+
void dfs(int u, vector<int>& nums, vector<int>& t, vector<vector<int>>& ans) {
108+
if (u == nums.size())
126109
{
127-
t.push_back(nums[j]);
128-
dfs(j + 1, nums, t, res);
129-
t.pop_back();
110+
ans.push_back(t);
111+
return;
130112
}
113+
dfs(u + 1, nums, t, ans);
114+
t.push_back(nums[u]);
115+
dfs(u + 1, nums, t, ans);
116+
t.pop_back();
131117
}
132118
};
133119
```
@@ -136,24 +122,21 @@ public:
136122
137123
```go
138124
func subsets(nums []int) [][]int {
139-
var res [][]int
140-
var t []int
141-
dfs(0, nums, t, &res)
142-
return res
143-
}
144-
145-
func dfs(i int, nums, t []int, res *[][]int) {
146-
cp := make([]int, len(t))
147-
copy(cp, t)
148-
*res = append(*res, cp)
149-
if i == len(nums) {
150-
return
151-
}
152-
for j := i; j < len(nums); j++ {
153-
t = append(t, nums[j])
154-
dfs(j+1, nums, t, res)
125+
var ans [][]int
126+
var dfs func(u int, t []int)
127+
dfs = func(u int, t []int) {
128+
if u == len(nums) {
129+
ans = append(ans, append([]int(nil), t...))
130+
return
131+
}
132+
dfs(u+1, t)
133+
t = append(t, nums[u])
134+
dfs(u+1, t)
155135
t = t[:len(t)-1]
156136
}
137+
var t []int
138+
dfs(0, t)
139+
return ans
157140
}
158141
```
159142

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

+49-49
Original file line numberDiff line numberDiff line change
@@ -43,41 +43,43 @@ DFS.
4343
```python
4444
class Solution:
4545
def subsets(self, nums: List[int]) -> List[List[int]]:
46-
res = []
47-
48-
def dfs(i, n, t):
49-
res.append(t.copy())
50-
if i == n:
46+
def dfs(u, t):
47+
if u == len(nums):
48+
ans.append(t[:])
5149
return
52-
for j in range(i, n):
53-
t.append(nums[j])
54-
dfs(j + 1, n, t)
55-
t.pop()
56-
57-
dfs(0, len(nums), [])
58-
return res
50+
dfs(u + 1, t)
51+
t.append(nums[u])
52+
dfs(u + 1, t)
53+
t.pop()
54+
55+
ans = []
56+
dfs(0, [])
57+
return ans
5958
```
6059

6160
### **Java**
6261

6362
```java
6463
class Solution {
64+
private List<List<Integer>> ans;
65+
private int[] nums;
66+
6567
public List<List<Integer>> subsets(int[] nums) {
66-
List<List<Integer>> res = new ArrayList<>();
67-
dfs(0, nums, new ArrayList<>(), res);
68-
return res;
68+
ans = new ArrayList<>();
69+
this.nums = nums;
70+
dfs(0, new ArrayList<>());
71+
return ans;
6972
}
7073

71-
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
72-
res.add(new ArrayList<>(t));
73-
if (i == nums.length) {
74+
private void dfs(int u, List<Integer> t) {
75+
if (u == nums.length) {
76+
ans.add(new ArrayList<>(t));
7477
return;
7578
}
76-
for (int j = i; j < nums.length; ++j) {
77-
t.add(nums[j]);
78-
dfs(j + 1, nums, t, res);
79-
t.remove(t.size() - 1);
80-
}
79+
dfs(u + 1, t);
80+
t.add(nums[u]);
81+
dfs(u + 1, t);
82+
t.remove(t.size() - 1);
8183
}
8284
}
8385
```
@@ -88,21 +90,22 @@ class Solution {
8890
class Solution {
8991
public:
9092
vector<vector<int>> subsets(vector<int>& nums) {
91-
vector<vector<int>> res;
93+
vector<vector<int>> ans;
9294
vector<int> t;
93-
dfs(0, nums, t, res);
94-
return res;
95+
dfs(0, nums, t, ans);
96+
return ans;
9597
}
9698

97-
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
98-
res.push_back(t);
99-
if (i == nums.size()) return;
100-
for (int j = i; j < nums.size(); ++j)
99+
void dfs(int u, vector<int>& nums, vector<int>& t, vector<vector<int>>& ans) {
100+
if (u == nums.size())
101101
{
102-
t.push_back(nums[j]);
103-
dfs(j + 1, nums, t, res);
104-
t.pop_back();
102+
ans.push_back(t);
103+
return;
105104
}
105+
dfs(u + 1, nums, t, ans);
106+
t.push_back(nums[u]);
107+
dfs(u + 1, nums, t, ans);
108+
t.pop_back();
106109
}
107110
};
108111
```
@@ -111,24 +114,21 @@ public:
111114
112115
```go
113116
func subsets(nums []int) [][]int {
114-
var res [][]int
115-
var t []int
116-
dfs(0, nums, t, &res)
117-
return res
118-
}
119-
120-
func dfs(i int, nums, t []int, res *[][]int) {
121-
cp := make([]int, len(t))
122-
copy(cp, t)
123-
*res = append(*res, cp)
124-
if i == len(nums) {
125-
return
126-
}
127-
for j := i; j < len(nums); j++ {
128-
t = append(t, nums[j])
129-
dfs(j+1, nums, t, res)
117+
var ans [][]int
118+
var dfs func(u int, t []int)
119+
dfs = func(u int, t []int) {
120+
if u == len(nums) {
121+
ans = append(ans, append([]int(nil), t...))
122+
return
123+
}
124+
dfs(u+1, t)
125+
t = append(t, nums[u])
126+
dfs(u+1, t)
130127
t = t[:len(t)-1]
131128
}
129+
var t []int
130+
dfs(0, t)
131+
return ans
132132
}
133133
```
134134

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
class Solution {
22
public:
33
vector<vector<int>> subsets(vector<int>& nums) {
4-
vector<vector<int>> res;
4+
vector<vector<int>> ans;
55
vector<int> t;
6-
dfs(0, nums, t, res);
7-
return res;
6+
dfs(0, nums, t, ans);
7+
return ans;
88
}
99

10-
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
11-
res.push_back(t);
12-
if (i == nums.size()) return;
13-
for (int j = i; j < nums.size(); ++j)
10+
void dfs(int u, vector<int>& nums, vector<int>& t, vector<vector<int>>& ans) {
11+
if (u == nums.size())
1412
{
15-
t.push_back(nums[j]);
16-
dfs(j + 1, nums, t, res);
17-
t.pop_back();
13+
ans.push_back(t);
14+
return;
1815
}
16+
dfs(u + 1, nums, t, ans);
17+
t.push_back(nums[u]);
18+
dfs(u + 1, nums, t, ans);
19+
t.pop_back();
1920
}
2021
};
+13-16
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
func subsets(nums []int) [][]int {
2-
var res [][]int
3-
var t []int
4-
dfs(0, nums, t, &res)
5-
return res
6-
}
7-
8-
func dfs(i int, nums, t []int, res *[][]int) {
9-
cp := make([]int, len(t))
10-
copy(cp, t)
11-
*res = append(*res, cp)
12-
if i == len(nums) {
13-
return
14-
}
15-
for j := i; j < len(nums); j++ {
16-
t = append(t, nums[j])
17-
dfs(j+1, nums, t, res)
2+
var ans [][]int
3+
var dfs func(u int, t []int)
4+
dfs = func(u int, t []int) {
5+
if u == len(nums) {
6+
ans = append(ans, append([]int(nil), t...))
7+
return
8+
}
9+
dfs(u+1, t)
10+
t = append(t, nums[u])
11+
dfs(u+1, t)
1812
t = t[:len(t)-1]
1913
}
14+
var t []int
15+
dfs(0, t)
16+
return ans
2017
}

0 commit comments

Comments
 (0)