Skip to content

Commit 1b03ec6

Browse files
authored
feat: add solutions to lc problems: No.0046,0078 (#3916)
1 parent ea6a6b0 commit 1b03ec6

14 files changed

+243
-210
lines changed

solution/0000-0099/0046.Permutations/README.md

+53-45
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,14 @@ tags:
7575
```python
7676
class Solution:
7777
def permute(self, nums: List[int]) -> List[List[int]]:
78-
return list(permutations(nums))
79-
```
80-
81-
#### Python3
82-
83-
```python
84-
class Solution:
85-
def permute(self, nums: List[int]) -> List[List[int]]:
86-
def dfs(i):
87-
if i == n:
78+
def dfs(i: int):
79+
if i >= n:
8880
ans.append(t[:])
8981
return
90-
for j in range(n):
82+
for j, x in enumerate(nums):
9183
if not vis[j]:
9284
vis[j] = True
93-
t[i] = nums[j]
85+
t[i] = x
9486
dfs(i + 1)
9587
vis[j] = False
9688

@@ -146,7 +138,7 @@ public:
146138
vector<vector<int>> ans;
147139
vector<int> t(n);
148140
vector<bool> vis(n);
149-
function<void(int)> dfs = [&](int i) {
141+
auto dfs = [&](this auto&& dfs, int i) -> void {
150142
if (i == n) {
151143
ans.emplace_back(t);
152144
return;
@@ -179,10 +171,10 @@ func permute(nums []int) (ans [][]int) {
179171
ans = append(ans, slices.Clone(t))
180172
return
181173
}
182-
for j, v := range nums {
174+
for j, x := range nums {
183175
if !vis[j] {
184176
vis[j] = true
185-
t[i] = v
177+
t[i] = x
186178
dfs(i + 1)
187179
vis[j] = false
188180
}
@@ -198,43 +190,60 @@ func permute(nums []int) (ans [][]int) {
198190
```ts
199191
function permute(nums: number[]): number[][] {
200192
const n = nums.length;
201-
const res: number[][] = [];
193+
const ans: number[][] = [];
194+
const vis: boolean[] = Array(n).fill(false);
195+
const t: number[] = Array(n).fill(0);
202196
const dfs = (i: number) => {
203-
if (i === n) {
204-
res.push([...nums]);
197+
if (i >= n) {
198+
ans.push(t.slice());
199+
return;
205200
}
206-
for (let j = i; j < n; j++) {
207-
[nums[i], nums[j]] = [nums[j], nums[i]];
208-
dfs(i + 1);
209-
[nums[i], nums[j]] = [nums[j], nums[i]];
201+
for (let j = 0; j < n; ++j) {
202+
if (!vis[j]) {
203+
vis[j] = true;
204+
t[i] = nums[j];
205+
dfs(i + 1);
206+
vis[j] = false;
207+
}
210208
}
211209
};
212210
dfs(0);
213-
return res;
211+
return ans;
214212
}
215213
```
216214

217215
#### Rust
218216

219217
```rust
220218
impl Solution {
221-
fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {
219+
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
222220
let n = nums.len();
223-
if i == n {
224-
res.push(nums.clone());
225-
return;
226-
}
227-
for j in i..n {
228-
nums.swap(i, j);
229-
Self::dfs(i + 1, nums, res);
230-
nums.swap(i, j);
221+
let mut ans = Vec::new();
222+
let mut t = vec![0; n];
223+
let mut vis = vec![false; n];
224+
fn dfs(
225+
nums: &Vec<i32>,
226+
n: usize,
227+
t: &mut Vec<i32>,
228+
vis: &mut Vec<bool>,
229+
ans: &mut Vec<Vec<i32>>,
230+
i: usize
231+
) {
232+
if i == n {
233+
ans.push(t.clone());
234+
return;
235+
}
236+
for j in 0..n {
237+
if !vis[j] {
238+
vis[j] = true;
239+
t[i] = nums[j];
240+
dfs(nums, n, t, vis, ans, i + 1);
241+
vis[j] = false;
242+
}
243+
}
231244
}
232-
}
233-
234-
pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
235-
let mut res = vec![];
236-
Self::dfs(0, &mut nums, &mut res);
237-
res
245+
dfs(&nums, n, &mut t, &mut vis, &mut ans, 0);
246+
ans
238247
}
239248
}
240249
```
@@ -249,23 +258,22 @@ impl Solution {
249258
var permute = function (nums) {
250259
const n = nums.length;
251260
const ans = [];
252-
const t = [];
253-
const vis = new Array(n).fill(false);
254-
function dfs(i) {
261+
const vis = Array(n).fill(false);
262+
const t = Array(n).fill(0);
263+
const dfs = i => {
255264
if (i >= n) {
256-
ans.push([...t]);
265+
ans.push(t.slice());
257266
return;
258267
}
259268
for (let j = 0; j < n; ++j) {
260269
if (!vis[j]) {
261270
vis[j] = true;
262-
t.push(nums[j]);
271+
t[i] = nums[j];
263272
dfs(i + 1);
264273
vis[j] = false;
265-
t.pop();
266274
}
267275
}
268-
}
276+
};
269277
dfs(0);
270278
return ans;
271279
};

solution/0000-0099/0046.Permutations/README_EN.md

+53-45
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,14 @@ Similar problems:
6262
```python
6363
class Solution:
6464
def permute(self, nums: List[int]) -> List[List[int]]:
65-
return list(permutations(nums))
66-
```
67-
68-
#### Python3
69-
70-
```python
71-
class Solution:
72-
def permute(self, nums: List[int]) -> List[List[int]]:
73-
def dfs(i):
74-
if i == n:
65+
def dfs(i: int):
66+
if i >= n:
7567
ans.append(t[:])
7668
return
77-
for j in range(n):
69+
for j, x in enumerate(nums):
7870
if not vis[j]:
7971
vis[j] = True
80-
t[i] = nums[j]
72+
t[i] = x
8173
dfs(i + 1)
8274
vis[j] = False
8375

@@ -133,7 +125,7 @@ public:
133125
vector<vector<int>> ans;
134126
vector<int> t(n);
135127
vector<bool> vis(n);
136-
function<void(int)> dfs = [&](int i) {
128+
auto dfs = [&](this auto&& dfs, int i) -> void {
137129
if (i == n) {
138130
ans.emplace_back(t);
139131
return;
@@ -166,10 +158,10 @@ func permute(nums []int) (ans [][]int) {
166158
ans = append(ans, slices.Clone(t))
167159
return
168160
}
169-
for j, v := range nums {
161+
for j, x := range nums {
170162
if !vis[j] {
171163
vis[j] = true
172-
t[i] = v
164+
t[i] = x
173165
dfs(i + 1)
174166
vis[j] = false
175167
}
@@ -185,43 +177,60 @@ func permute(nums []int) (ans [][]int) {
185177
```ts
186178
function permute(nums: number[]): number[][] {
187179
const n = nums.length;
188-
const res: number[][] = [];
180+
const ans: number[][] = [];
181+
const vis: boolean[] = Array(n).fill(false);
182+
const t: number[] = Array(n).fill(0);
189183
const dfs = (i: number) => {
190-
if (i === n) {
191-
res.push([...nums]);
184+
if (i >= n) {
185+
ans.push(t.slice());
186+
return;
192187
}
193-
for (let j = i; j < n; j++) {
194-
[nums[i], nums[j]] = [nums[j], nums[i]];
195-
dfs(i + 1);
196-
[nums[i], nums[j]] = [nums[j], nums[i]];
188+
for (let j = 0; j < n; ++j) {
189+
if (!vis[j]) {
190+
vis[j] = true;
191+
t[i] = nums[j];
192+
dfs(i + 1);
193+
vis[j] = false;
194+
}
197195
}
198196
};
199197
dfs(0);
200-
return res;
198+
return ans;
201199
}
202200
```
203201

204202
#### Rust
205203

206204
```rust
207205
impl Solution {
208-
fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {
206+
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
209207
let n = nums.len();
210-
if i == n {
211-
res.push(nums.clone());
212-
return;
213-
}
214-
for j in i..n {
215-
nums.swap(i, j);
216-
Self::dfs(i + 1, nums, res);
217-
nums.swap(i, j);
208+
let mut ans = Vec::new();
209+
let mut t = vec![0; n];
210+
let mut vis = vec![false; n];
211+
fn dfs(
212+
nums: &Vec<i32>,
213+
n: usize,
214+
t: &mut Vec<i32>,
215+
vis: &mut Vec<bool>,
216+
ans: &mut Vec<Vec<i32>>,
217+
i: usize
218+
) {
219+
if i == n {
220+
ans.push(t.clone());
221+
return;
222+
}
223+
for j in 0..n {
224+
if !vis[j] {
225+
vis[j] = true;
226+
t[i] = nums[j];
227+
dfs(nums, n, t, vis, ans, i + 1);
228+
vis[j] = false;
229+
}
230+
}
218231
}
219-
}
220-
221-
pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
222-
let mut res = vec![];
223-
Self::dfs(0, &mut nums, &mut res);
224-
res
232+
dfs(&nums, n, &mut t, &mut vis, &mut ans, 0);
233+
ans
225234
}
226235
}
227236
```
@@ -236,23 +245,22 @@ impl Solution {
236245
var permute = function (nums) {
237246
const n = nums.length;
238247
const ans = [];
239-
const t = [];
240-
const vis = new Array(n).fill(false);
241-
function dfs(i) {
248+
const vis = Array(n).fill(false);
249+
const t = Array(n).fill(0);
250+
const dfs = i => {
242251
if (i >= n) {
243-
ans.push([...t]);
252+
ans.push(t.slice());
244253
return;
245254
}
246255
for (let j = 0; j < n; ++j) {
247256
if (!vis[j]) {
248257
vis[j] = true;
249-
t.push(nums[j]);
258+
t[i] = nums[j];
250259
dfs(i + 1);
251260
vis[j] = false;
252-
t.pop();
253261
}
254262
}
255-
}
263+
};
256264
dfs(0);
257265
return ans;
258266
};

solution/0000-0099/0046.Permutations/Solution.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class Solution {
55
vector<vector<int>> ans;
66
vector<int> t(n);
77
vector<bool> vis(n);
8-
function<void(int)> dfs = [&](int i) {
8+
auto dfs = [&](this auto&& dfs, int i) -> void {
99
if (i == n) {
1010
ans.emplace_back(t);
1111
return;
@@ -22,4 +22,4 @@ class Solution {
2222
dfs(0);
2323
return ans;
2424
}
25-
};
25+
};

solution/0000-0099/0046.Permutations/Solution.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ func permute(nums []int) (ans [][]int) {
88
ans = append(ans, slices.Clone(t))
99
return
1010
}
11-
for j, v := range nums {
11+
for j, x := range nums {
1212
if !vis[j] {
1313
vis[j] = true
14-
t[i] = v
14+
t[i] = x
1515
dfs(i + 1)
1616
vis[j] = false
1717
}
1818
}
1919
}
2020
dfs(0)
2121
return
22-
}
22+
}

solution/0000-0099/0046.Permutations/Solution.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,22 @@
55
var permute = function (nums) {
66
const n = nums.length;
77
const ans = [];
8-
const t = [];
9-
const vis = new Array(n).fill(false);
10-
function dfs(i) {
8+
const vis = Array(n).fill(false);
9+
const t = Array(n).fill(0);
10+
const dfs = i => {
1111
if (i >= n) {
12-
ans.push([...t]);
12+
ans.push(t.slice());
1313
return;
1414
}
1515
for (let j = 0; j < n; ++j) {
1616
if (!vis[j]) {
1717
vis[j] = true;
18-
t.push(nums[j]);
18+
t[i] = nums[j];
1919
dfs(i + 1);
2020
vis[j] = false;
21-
t.pop();
2221
}
2322
}
24-
}
23+
};
2524
dfs(0);
2625
return ans;
2726
};

0 commit comments

Comments
 (0)