Skip to content

feat: add solutions to lc problems: No.0046,0078 #3916

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 1, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 53 additions & 45 deletions solution/0000-0099/0046.Permutations/README.md
Original file line number Diff line number Diff line change
@@ -75,22 +75,14 @@ tags:
```python
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(permutations(nums))
```

#### Python3

```python
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def dfs(i):
if i == n:
def dfs(i: int):
if i >= n:
ans.append(t[:])
return
for j in range(n):
for j, x in enumerate(nums):
if not vis[j]:
vis[j] = True
t[i] = nums[j]
t[i] = x
dfs(i + 1)
vis[j] = False

@@ -146,7 +138,7 @@ public:
vector<vector<int>> ans;
vector<int> t(n);
vector<bool> vis(n);
function<void(int)> dfs = [&](int i) {
auto dfs = [&](this auto&& dfs, int i) -> void {
if (i == n) {
ans.emplace_back(t);
return;
@@ -179,10 +171,10 @@ func permute(nums []int) (ans [][]int) {
ans = append(ans, slices.Clone(t))
return
}
for j, v := range nums {
for j, x := range nums {
if !vis[j] {
vis[j] = true
t[i] = v
t[i] = x
dfs(i + 1)
vis[j] = false
}
@@ -198,43 +190,60 @@ func permute(nums []int) (ans [][]int) {
```ts
function permute(nums: number[]): number[][] {
const n = nums.length;
const res: number[][] = [];
const ans: number[][] = [];
const vis: boolean[] = Array(n).fill(false);
const t: number[] = Array(n).fill(0);
const dfs = (i: number) => {
if (i === n) {
res.push([...nums]);
if (i >= n) {
ans.push(t.slice());
return;
}
for (let j = i; j < n; j++) {
[nums[i], nums[j]] = [nums[j], nums[i]];
dfs(i + 1);
[nums[i], nums[j]] = [nums[j], nums[i]];
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
}
}
};
dfs(0);
return res;
return ans;
}
```

#### Rust

```rust
impl Solution {
fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
if i == n {
res.push(nums.clone());
return;
}
for j in i..n {
nums.swap(i, j);
Self::dfs(i + 1, nums, res);
nums.swap(i, j);
let mut ans = Vec::new();
let mut t = vec![0; n];
let mut vis = vec![false; n];
fn dfs(
nums: &Vec<i32>,
n: usize,
t: &mut Vec<i32>,
vis: &mut Vec<bool>,
ans: &mut Vec<Vec<i32>>,
i: usize
) {
if i == n {
ans.push(t.clone());
return;
}
for j in 0..n {
if !vis[j] {
vis[j] = true;
t[i] = nums[j];
dfs(nums, n, t, vis, ans, i + 1);
vis[j] = false;
}
}
}
}

pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = vec![];
Self::dfs(0, &mut nums, &mut res);
res
dfs(&nums, n, &mut t, &mut vis, &mut ans, 0);
ans
}
}
```
@@ -249,23 +258,22 @@ impl Solution {
var permute = function (nums) {
const n = nums.length;
const ans = [];
const t = [];
const vis = new Array(n).fill(false);
function dfs(i) {
const vis = Array(n).fill(false);
const t = Array(n).fill(0);
const dfs = i => {
if (i >= n) {
ans.push([...t]);
ans.push(t.slice());
return;
}
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t.push(nums[j]);
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
t.pop();
}
}
}
};
dfs(0);
return ans;
};
98 changes: 53 additions & 45 deletions solution/0000-0099/0046.Permutations/README_EN.md
Original file line number Diff line number Diff line change
@@ -62,22 +62,14 @@ Similar problems:
```python
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(permutations(nums))
```

#### Python3

```python
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def dfs(i):
if i == n:
def dfs(i: int):
if i >= n:
ans.append(t[:])
return
for j in range(n):
for j, x in enumerate(nums):
if not vis[j]:
vis[j] = True
t[i] = nums[j]
t[i] = x
dfs(i + 1)
vis[j] = False

@@ -133,7 +125,7 @@ public:
vector<vector<int>> ans;
vector<int> t(n);
vector<bool> vis(n);
function<void(int)> dfs = [&](int i) {
auto dfs = [&](this auto&& dfs, int i) -> void {
if (i == n) {
ans.emplace_back(t);
return;
@@ -166,10 +158,10 @@ func permute(nums []int) (ans [][]int) {
ans = append(ans, slices.Clone(t))
return
}
for j, v := range nums {
for j, x := range nums {
if !vis[j] {
vis[j] = true
t[i] = v
t[i] = x
dfs(i + 1)
vis[j] = false
}
@@ -185,43 +177,60 @@ func permute(nums []int) (ans [][]int) {
```ts
function permute(nums: number[]): number[][] {
const n = nums.length;
const res: number[][] = [];
const ans: number[][] = [];
const vis: boolean[] = Array(n).fill(false);
const t: number[] = Array(n).fill(0);
const dfs = (i: number) => {
if (i === n) {
res.push([...nums]);
if (i >= n) {
ans.push(t.slice());
return;
}
for (let j = i; j < n; j++) {
[nums[i], nums[j]] = [nums[j], nums[i]];
dfs(i + 1);
[nums[i], nums[j]] = [nums[j], nums[i]];
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
}
}
};
dfs(0);
return res;
return ans;
}
```

#### Rust

```rust
impl Solution {
fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
if i == n {
res.push(nums.clone());
return;
}
for j in i..n {
nums.swap(i, j);
Self::dfs(i + 1, nums, res);
nums.swap(i, j);
let mut ans = Vec::new();
let mut t = vec![0; n];
let mut vis = vec![false; n];
fn dfs(
nums: &Vec<i32>,
n: usize,
t: &mut Vec<i32>,
vis: &mut Vec<bool>,
ans: &mut Vec<Vec<i32>>,
i: usize
) {
if i == n {
ans.push(t.clone());
return;
}
for j in 0..n {
if !vis[j] {
vis[j] = true;
t[i] = nums[j];
dfs(nums, n, t, vis, ans, i + 1);
vis[j] = false;
}
}
}
}

pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = vec![];
Self::dfs(0, &mut nums, &mut res);
res
dfs(&nums, n, &mut t, &mut vis, &mut ans, 0);
ans
}
}
```
@@ -236,23 +245,22 @@ impl Solution {
var permute = function (nums) {
const n = nums.length;
const ans = [];
const t = [];
const vis = new Array(n).fill(false);
function dfs(i) {
const vis = Array(n).fill(false);
const t = Array(n).fill(0);
const dfs = i => {
if (i >= n) {
ans.push([...t]);
ans.push(t.slice());
return;
}
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t.push(nums[j]);
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
t.pop();
}
}
}
};
dfs(0);
return ans;
};
4 changes: 2 additions & 2 deletions solution/0000-0099/0046.Permutations/Solution.cpp
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ class Solution {
vector<vector<int>> ans;
vector<int> t(n);
vector<bool> vis(n);
function<void(int)> dfs = [&](int i) {
auto dfs = [&](this auto&& dfs, int i) -> void {
if (i == n) {
ans.emplace_back(t);
return;
@@ -22,4 +22,4 @@ class Solution {
dfs(0);
return ans;
}
};
};
6 changes: 3 additions & 3 deletions solution/0000-0099/0046.Permutations/Solution.go
Original file line number Diff line number Diff line change
@@ -8,15 +8,15 @@ func permute(nums []int) (ans [][]int) {
ans = append(ans, slices.Clone(t))
return
}
for j, v := range nums {
for j, x := range nums {
if !vis[j] {
vis[j] = true
t[i] = v
t[i] = x
dfs(i + 1)
vis[j] = false
}
}
}
dfs(0)
return
}
}
13 changes: 6 additions & 7 deletions solution/0000-0099/0046.Permutations/Solution.js
Original file line number Diff line number Diff line change
@@ -5,23 +5,22 @@
var permute = function (nums) {
const n = nums.length;
const ans = [];
const t = [];
const vis = new Array(n).fill(false);
function dfs(i) {
const vis = Array(n).fill(false);
const t = Array(n).fill(0);
const dfs = i => {
if (i >= n) {
ans.push([...t]);
ans.push(t.slice());
return;
}
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t.push(nums[j]);
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
t.pop();
}
}
}
};
dfs(0);
return ans;
};
18 changes: 17 additions & 1 deletion solution/0000-0099/0046.Permutations/Solution.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(permutations(nums))
def dfs(i: int):
if i >= n:
ans.append(t[:])
return
for j, x in enumerate(nums):
if not vis[j]:
vis[j] = True
t[i] = x
dfs(i + 1)
vis[j] = False

n = len(nums)
vis = [False] * n
t = [0] * n
ans = []
dfs(0)
return ans
41 changes: 26 additions & 15 deletions solution/0000-0099/0046.Permutations/Solution.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
impl Solution {
fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) {
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
if i == n {
res.push(nums.clone());
return;
let mut ans = Vec::new();
let mut t = vec![0; n];
let mut vis = vec![false; n];
fn dfs(
nums: &Vec<i32>,
n: usize,
t: &mut Vec<i32>,
vis: &mut Vec<bool>,
ans: &mut Vec<Vec<i32>>,
i: usize,
) {
if i == n {
ans.push(t.clone());
return;
}
for j in 0..n {
if !vis[j] {
vis[j] = true;
t[i] = nums[j];
dfs(nums, n, t, vis, ans, i + 1);
vis[j] = false;
}
}
}
for j in i..n {
nums.swap(i, j);
Self::dfs(i + 1, nums, res);
nums.swap(i, j);
}
}

pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = vec![];
Self::dfs(0, &mut nums, &mut res);
res
dfs(&nums, n, &mut t, &mut vis, &mut ans, 0);
ans
}
}
22 changes: 14 additions & 8 deletions solution/0000-0099/0046.Permutations/Solution.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
function permute(nums: number[]): number[][] {
const n = nums.length;
const res: number[][] = [];
const ans: number[][] = [];
const vis: boolean[] = Array(n).fill(false);
const t: number[] = Array(n).fill(0);
const dfs = (i: number) => {
if (i === n) {
res.push([...nums]);
if (i >= n) {
ans.push(t.slice());
return;
}
for (let j = i; j < n; j++) {
[nums[i], nums[j]] = [nums[j], nums[i]];
dfs(i + 1);
[nums[i], nums[j]] = [nums[j], nums[i]];
for (let j = 0; j < n; ++j) {
if (!vis[j]) {
vis[j] = true;
t[i] = nums[j];
dfs(i + 1);
vis[j] = false;
}
}
};
dfs(0);
return res;
return ans;
}
19 changes: 0 additions & 19 deletions solution/0000-0099/0046.Permutations/Solution2.py

This file was deleted.

48 changes: 23 additions & 25 deletions solution/0000-0099/0078.Subsets/README.md
Original file line number Diff line number Diff line change
@@ -184,21 +184,21 @@ function subsets(nums: number[]): number[][] {

```rust
impl Solution {
fn dfs(i: usize, t: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
fn dfs(i: usize, t: &mut Vec<i32>, ans: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
if i == nums.len() {
res.push(t.clone());
ans.push(t.clone());
return;
}
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.push(nums[i]);
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.pop();
}

pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut res, &nums);
res
let mut ans = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut ans, &nums);
ans
}
}
```
@@ -311,26 +311,24 @@ function subsets(nums: number[]): number[][] {
}
```

<!-- tabs:end -->

<!-- solution:end -->

<!-- solution:start -->

### 方法三

<!-- tabs:start -->

#### TypeScript
#### Rust

```ts
function subsets(nums: number[]): number[][] {
const res: number[][] = [[]];
for (const x of nums) {
res.push(...res.map(arr => [...arr, x]));
```rust
impl Solution {
pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
let mut ans = Vec::new();
for mask in 0..(1 << n) {
let mut t = Vec::new();
for i in 0..n {
if (mask >> i) & 1 == 1 {
t.push(nums[i]);
}
}
ans.push(t);
}
ans
}

return res;
}
```

48 changes: 23 additions & 25 deletions solution/0000-0099/0078.Subsets/README_EN.md
Original file line number Diff line number Diff line change
@@ -182,21 +182,21 @@ function subsets(nums: number[]): number[][] {

```rust
impl Solution {
fn dfs(i: usize, t: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
fn dfs(i: usize, t: &mut Vec<i32>, ans: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
if i == nums.len() {
res.push(t.clone());
ans.push(t.clone());
return;
}
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.push(nums[i]);
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.pop();
}

pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut res, &nums);
res
let mut ans = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut ans, &nums);
ans
}
}
```
@@ -309,26 +309,24 @@ function subsets(nums: number[]): number[][] {
}
```

<!-- tabs:end -->

<!-- solution:end -->

<!-- solution:start -->

### Solution 3

<!-- tabs:start -->

#### TypeScript
#### Rust

```ts
function subsets(nums: number[]): number[][] {
const res: number[][] = [[]];
for (const x of nums) {
res.push(...res.map(arr => [...arr, x]));
```rust
impl Solution {
pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
let mut ans = Vec::new();
for mask in 0..(1 << n) {
let mut t = Vec::new();
for i in 0..n {
if (mask >> i) & 1 == 1 {
t.push(nums[i]);
}
}
ans.push(t);
}
ans
}

return res;
}
```

14 changes: 7 additions & 7 deletions solution/0000-0099/0078.Subsets/Solution.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
impl Solution {
fn dfs(i: usize, t: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
fn dfs(i: usize, t: &mut Vec<i32>, ans: &mut Vec<Vec<i32>>, nums: &Vec<i32>) {
if i == nums.len() {
res.push(t.clone());
ans.push(t.clone());
return;
}
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.push(nums[i]);
Self::dfs(i + 1, t, res, nums);
Self::dfs(i + 1, t, ans, nums);
t.pop();
}

pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut res, &nums);
res
let mut ans = Vec::new();
Self::dfs(0, &mut Vec::new(), &mut ans, &nums);
ans
}
}
16 changes: 16 additions & 0 deletions solution/0000-0099/0078.Subsets/Solution2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
impl Solution {
pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
let n = nums.len();
let mut ans = Vec::new();
for mask in 0..(1 << n) {
let mut t = Vec::new();
for i in 0..n {
if (mask >> i) & 1 == 1 {
t.push(nums[i]);
}
}
ans.push(t);
}
ans
}
}
8 changes: 0 additions & 8 deletions solution/0000-0099/0078.Subsets/Solution3.ts

This file was deleted.