From 0489f6665fdd142a15fccae2091b978a1c814cfa Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 1 Jan 2025 21:12:54 +0800 Subject: [PATCH] feat: add solutions to lc problems: No.0046,0078 --- .../0000-0099/0046.Permutations/README.md | 98 ++++++++++--------- .../0000-0099/0046.Permutations/README_EN.md | 98 ++++++++++--------- .../0000-0099/0046.Permutations/Solution.cpp | 4 +- .../0000-0099/0046.Permutations/Solution.go | 6 +- .../0000-0099/0046.Permutations/Solution.js | 13 ++- .../0000-0099/0046.Permutations/Solution.py | 18 +++- .../0000-0099/0046.Permutations/Solution.rs | 41 +++++--- .../0000-0099/0046.Permutations/Solution.ts | 22 +++-- .../0000-0099/0046.Permutations/Solution2.py | 19 ---- solution/0000-0099/0078.Subsets/README.md | 48 +++++---- solution/0000-0099/0078.Subsets/README_EN.md | 48 +++++---- solution/0000-0099/0078.Subsets/Solution.rs | 14 +-- solution/0000-0099/0078.Subsets/Solution2.rs | 16 +++ solution/0000-0099/0078.Subsets/Solution3.ts | 8 -- 14 files changed, 243 insertions(+), 210 deletions(-) delete mode 100644 solution/0000-0099/0046.Permutations/Solution2.py create mode 100644 solution/0000-0099/0078.Subsets/Solution2.rs delete mode 100644 solution/0000-0099/0078.Subsets/Solution3.ts diff --git a/solution/0000-0099/0046.Permutations/README.md b/solution/0000-0099/0046.Permutations/README.md index 01cfaefb2f235..95d83755121fb 100644 --- a/solution/0000-0099/0046.Permutations/README.md +++ b/solution/0000-0099/0046.Permutations/README.md @@ -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> ans; vector t(n); vector vis(n); - function 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,19 +190,25 @@ 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; } ``` @@ -218,23 +216,34 @@ function permute(nums: number[]): number[][] { ```rust impl Solution { - fn dfs(i: usize, nums: &mut Vec, res: &mut Vec>) { + pub fn permute(nums: Vec) -> Vec> { 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, + n: usize, + t: &mut Vec, + vis: &mut Vec, + ans: &mut Vec>, + 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) -> Vec> { - 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; }; diff --git a/solution/0000-0099/0046.Permutations/README_EN.md b/solution/0000-0099/0046.Permutations/README_EN.md index 056f26bad4088..5a7e76f09c27a 100644 --- a/solution/0000-0099/0046.Permutations/README_EN.md +++ b/solution/0000-0099/0046.Permutations/README_EN.md @@ -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> ans; vector t(n); vector vis(n); - function 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,19 +177,25 @@ 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; } ``` @@ -205,23 +203,34 @@ function permute(nums: number[]): number[][] { ```rust impl Solution { - fn dfs(i: usize, nums: &mut Vec, res: &mut Vec>) { + pub fn permute(nums: Vec) -> Vec> { 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, + n: usize, + t: &mut Vec, + vis: &mut Vec, + ans: &mut Vec>, + 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) -> Vec> { - 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; }; diff --git a/solution/0000-0099/0046.Permutations/Solution.cpp b/solution/0000-0099/0046.Permutations/Solution.cpp index 563d54fba0f93..9500af21b5b49 100644 --- a/solution/0000-0099/0046.Permutations/Solution.cpp +++ b/solution/0000-0099/0046.Permutations/Solution.cpp @@ -5,7 +5,7 @@ class Solution { vector> ans; vector t(n); vector vis(n); - function 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; } -}; \ No newline at end of file +}; diff --git a/solution/0000-0099/0046.Permutations/Solution.go b/solution/0000-0099/0046.Permutations/Solution.go index 2856587a3065b..f8dae1116aef6 100644 --- a/solution/0000-0099/0046.Permutations/Solution.go +++ b/solution/0000-0099/0046.Permutations/Solution.go @@ -8,10 +8,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 } @@ -19,4 +19,4 @@ func permute(nums []int) (ans [][]int) { } dfs(0) return -} \ No newline at end of file +} diff --git a/solution/0000-0099/0046.Permutations/Solution.js b/solution/0000-0099/0046.Permutations/Solution.js index 23b4912d08ddb..25ca54b1828a7 100644 --- a/solution/0000-0099/0046.Permutations/Solution.js +++ b/solution/0000-0099/0046.Permutations/Solution.js @@ -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; }; diff --git a/solution/0000-0099/0046.Permutations/Solution.py b/solution/0000-0099/0046.Permutations/Solution.py index dbab773b937d7..0e95fe85758d6 100644 --- a/solution/0000-0099/0046.Permutations/Solution.py +++ b/solution/0000-0099/0046.Permutations/Solution.py @@ -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 diff --git a/solution/0000-0099/0046.Permutations/Solution.rs b/solution/0000-0099/0046.Permutations/Solution.rs index 67130f731e91d..52aa3e44add4b 100644 --- a/solution/0000-0099/0046.Permutations/Solution.rs +++ b/solution/0000-0099/0046.Permutations/Solution.rs @@ -1,20 +1,31 @@ impl Solution { - fn dfs(i: usize, nums: &mut Vec, res: &mut Vec>) { + pub fn permute(nums: Vec) -> Vec> { 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, + n: usize, + t: &mut Vec, + vis: &mut Vec, + ans: &mut Vec>, + 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) -> Vec> { - let mut res = vec![]; - Self::dfs(0, &mut nums, &mut res); - res + dfs(&nums, n, &mut t, &mut vis, &mut ans, 0); + ans } } diff --git a/solution/0000-0099/0046.Permutations/Solution.ts b/solution/0000-0099/0046.Permutations/Solution.ts index a9de63304afe6..8abe1f836732e 100644 --- a/solution/0000-0099/0046.Permutations/Solution.ts +++ b/solution/0000-0099/0046.Permutations/Solution.ts @@ -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; } diff --git a/solution/0000-0099/0046.Permutations/Solution2.py b/solution/0000-0099/0046.Permutations/Solution2.py deleted file mode 100644 index b5421540a2a90..0000000000000 --- a/solution/0000-0099/0046.Permutations/Solution2.py +++ /dev/null @@ -1,19 +0,0 @@ -class Solution: - def permute(self, nums: List[int]) -> List[List[int]]: - def dfs(i): - if i == n: - ans.append(t[:]) - return - for j in range(n): - if not vis[j]: - vis[j] = True - t[i] = nums[j] - dfs(i + 1) - vis[j] = False - - n = len(nums) - vis = [False] * n - t = [0] * n - ans = [] - dfs(0) - return ans diff --git a/solution/0000-0099/0078.Subsets/README.md b/solution/0000-0099/0078.Subsets/README.md index 399ab297d9a79..b5d58b89959e1 100644 --- a/solution/0000-0099/0078.Subsets/README.md +++ b/solution/0000-0099/0078.Subsets/README.md @@ -184,21 +184,21 @@ function subsets(nums: number[]): number[][] { ```rust impl Solution { - fn dfs(i: usize, t: &mut Vec, res: &mut Vec>, nums: &Vec) { + fn dfs(i: usize, t: &mut Vec, ans: &mut Vec>, nums: &Vec) { 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) -> Vec> { - 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[][] { } ``` - - - - - - -### 方法三 - - - -#### 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) -> Vec> { + 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; } ``` diff --git a/solution/0000-0099/0078.Subsets/README_EN.md b/solution/0000-0099/0078.Subsets/README_EN.md index 1ee939f5ce1f1..e57019a650a20 100644 --- a/solution/0000-0099/0078.Subsets/README_EN.md +++ b/solution/0000-0099/0078.Subsets/README_EN.md @@ -182,21 +182,21 @@ function subsets(nums: number[]): number[][] { ```rust impl Solution { - fn dfs(i: usize, t: &mut Vec, res: &mut Vec>, nums: &Vec) { + fn dfs(i: usize, t: &mut Vec, ans: &mut Vec>, nums: &Vec) { 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) -> Vec> { - 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[][] { } ``` - - - - - - -### Solution 3 - - - -#### 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) -> Vec> { + 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; } ``` diff --git a/solution/0000-0099/0078.Subsets/Solution.rs b/solution/0000-0099/0078.Subsets/Solution.rs index 1a542ef270418..2e253f591e127 100644 --- a/solution/0000-0099/0078.Subsets/Solution.rs +++ b/solution/0000-0099/0078.Subsets/Solution.rs @@ -1,18 +1,18 @@ impl Solution { - fn dfs(i: usize, t: &mut Vec, res: &mut Vec>, nums: &Vec) { + fn dfs(i: usize, t: &mut Vec, ans: &mut Vec>, nums: &Vec) { 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) -> Vec> { - 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 } } diff --git a/solution/0000-0099/0078.Subsets/Solution2.rs b/solution/0000-0099/0078.Subsets/Solution2.rs new file mode 100644 index 0000000000000..1413b62302537 --- /dev/null +++ b/solution/0000-0099/0078.Subsets/Solution2.rs @@ -0,0 +1,16 @@ +impl Solution { + pub fn subsets(nums: Vec) -> Vec> { + 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 + } +} diff --git a/solution/0000-0099/0078.Subsets/Solution3.ts b/solution/0000-0099/0078.Subsets/Solution3.ts deleted file mode 100644 index 12637fe8ae0ce..0000000000000 --- a/solution/0000-0099/0078.Subsets/Solution3.ts +++ /dev/null @@ -1,8 +0,0 @@ -function subsets(nums: number[]): number[][] { - const res: number[][] = [[]]; - for (const x of nums) { - res.push(...res.map(arr => [...arr, x])); - } - - return res; -}