mirror of https://github.com/doocs/leetcode.git
feat: add solutions to lc/lcof2 problem: Subsets
This commit is contained in:
parent
3db198bc35
commit
c5df5c4f3c
|
|
@ -8,6 +8,7 @@ on:
|
|||
- "**.jpeg"
|
||||
- "**.png"
|
||||
- "**.webp"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
compress:
|
||||
|
|
|
|||
|
|
@ -43,6 +43,23 @@
|
|||
|
||||
<!-- 这里可写通用的实现逻辑 -->
|
||||
|
||||
回溯法的基本模板:
|
||||
|
||||
```py
|
||||
res = []
|
||||
path = []
|
||||
|
||||
def backtrack(未探索区域, res, path):
|
||||
if path 满足条件:
|
||||
res.add(path) # 深度拷贝
|
||||
# return # 如果不用继续搜索需要 return
|
||||
for 选择 in 未探索区域当前可能的选择:
|
||||
if 当前选择符合要求:
|
||||
path.add(当前选择)
|
||||
backtrack(新的未探索区域, res, path)
|
||||
path.pop()
|
||||
```
|
||||
|
||||
<!-- tabs:start -->
|
||||
|
||||
### **Python3**
|
||||
|
|
@ -50,7 +67,21 @@
|
|||
<!-- 这里可写当前语言的特殊实现逻辑 -->
|
||||
|
||||
```python
|
||||
class Solution:
|
||||
def subsets(self, nums: List[int]) -> List[List[int]]:
|
||||
res = []
|
||||
|
||||
def dfs(i, n, t):
|
||||
res.append(t.copy())
|
||||
if i == n:
|
||||
return
|
||||
for j in range(i, n):
|
||||
t.append(nums[j])
|
||||
dfs(j + 1, n, t)
|
||||
t.pop()
|
||||
|
||||
dfs(0, len(nums), [])
|
||||
return res
|
||||
```
|
||||
|
||||
### **Java**
|
||||
|
|
@ -58,7 +89,75 @@
|
|||
<!-- 这里可写当前语言的特殊实现逻辑 -->
|
||||
|
||||
```java
|
||||
class Solution {
|
||||
public List<List<Integer>> subsets(int[] nums) {
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
dfs(0, nums, new ArrayList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
|
||||
res.add(new ArrayList<>(t));
|
||||
if (i == nums.length) {
|
||||
return;
|
||||
}
|
||||
for (int j = i; j < nums.length; ++j) {
|
||||
t.add(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.remove(t.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **C++**
|
||||
|
||||
```cpp
|
||||
class Solution {
|
||||
public:
|
||||
vector<vector<int>> subsets(vector<int>& nums) {
|
||||
vector<vector<int>> res;
|
||||
vector<int> t;
|
||||
dfs(0, nums, t, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
|
||||
res.push_back(t);
|
||||
if (i == nums.size()) return;
|
||||
for (int j = i; j < nums.size(); ++j)
|
||||
{
|
||||
t.push_back(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### **Go**
|
||||
|
||||
```go
|
||||
func subsets(nums []int) [][]int {
|
||||
var res [][]int
|
||||
var t []int
|
||||
dfs(0, nums, t, &res)
|
||||
return res
|
||||
}
|
||||
|
||||
func dfs(i int, nums, t []int, res *[][]int) {
|
||||
cp := make([]int, len(t))
|
||||
copy(cp, t)
|
||||
*res = append(*res, cp)
|
||||
if i == len(nums) {
|
||||
return
|
||||
}
|
||||
for j := i; j < len(nums); j++ {
|
||||
t = append(t, nums[j])
|
||||
dfs(j+1, nums, t, res)
|
||||
t = t[:len(t)-1]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **...**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
class Solution {
|
||||
public:
|
||||
vector<vector<int>> subsets(vector<int>& nums) {
|
||||
vector<vector<int>> res;
|
||||
vector<int> t;
|
||||
dfs(0, nums, t, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
|
||||
res.push_back(t);
|
||||
if (i == nums.size()) return;
|
||||
for (int j = i; j < nums.size(); ++j)
|
||||
{
|
||||
t.push_back(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
func subsets(nums []int) [][]int {
|
||||
var res [][]int
|
||||
var t []int
|
||||
dfs(0, nums, t, &res)
|
||||
return res
|
||||
}
|
||||
|
||||
func dfs(i int, nums, t []int, res *[][]int) {
|
||||
cp := make([]int, len(t))
|
||||
copy(cp, t)
|
||||
*res = append(*res, cp)
|
||||
if i == len(nums) {
|
||||
return
|
||||
}
|
||||
for j := i; j < len(nums); j++ {
|
||||
t = append(t, nums[j])
|
||||
dfs(j+1, nums, t, res)
|
||||
t = t[:len(t)-1]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
class Solution {
|
||||
public List<List<Integer>> subsets(int[] nums) {
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
dfs(0, nums, new ArrayList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
|
||||
res.add(new ArrayList<>(t));
|
||||
if (i == nums.length) {
|
||||
return;
|
||||
}
|
||||
for (int j = i; j < nums.length; ++j) {
|
||||
t.add(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.remove(t.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
class Solution:
|
||||
def subsets(self, nums: List[int]) -> List[List[int]]:
|
||||
res = []
|
||||
|
||||
def dfs(i, n, t):
|
||||
res.append(t.copy())
|
||||
if i == n:
|
||||
return
|
||||
for j in range(i, n):
|
||||
t.append(nums[j])
|
||||
dfs(j + 1, n, t)
|
||||
t.pop()
|
||||
|
||||
dfs(0, len(nums), [])
|
||||
return res
|
||||
|
|
@ -36,7 +36,6 @@
|
|||
<li><code>nums</code> 中的所有元素 <strong>互不相同</strong></li>
|
||||
</ul>
|
||||
|
||||
|
||||
## 解法
|
||||
|
||||
<!-- 这里可写通用的实现逻辑 -->
|
||||
|
|
@ -67,15 +66,18 @@ def backtrack(未探索区域, res, path):
|
|||
```python
|
||||
class Solution:
|
||||
def subsets(self, nums: List[int]) -> List[List[int]]:
|
||||
def dfs(nums, i, res, path):
|
||||
res.append(copy.deepcopy(path))
|
||||
while i < len(nums):
|
||||
path.append(nums[i])
|
||||
dfs(nums, i + 1, res, path)
|
||||
path.pop()
|
||||
i += 1
|
||||
res, path = [], []
|
||||
dfs(nums, 0, res, path)
|
||||
res = []
|
||||
|
||||
def dfs(i, n, t):
|
||||
res.append(t.copy())
|
||||
if i == n:
|
||||
return
|
||||
for j in range(i, n):
|
||||
t.append(nums[j])
|
||||
dfs(j + 1, n, t)
|
||||
t.pop()
|
||||
|
||||
dfs(0, len(nums), [])
|
||||
return res
|
||||
```
|
||||
|
||||
|
|
@ -86,24 +88,75 @@ class Solution:
|
|||
```java
|
||||
class Solution {
|
||||
public List<List<Integer>> subsets(int[] nums) {
|
||||
List<Integer> path = new ArrayList<>();
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
dfs(nums, 0, res, path);
|
||||
dfs(0, nums, new ArrayList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
private void dfs(int[] nums, int i, List<List<Integer>> res, List<Integer> path) {
|
||||
res.add(new ArrayList<>(path));
|
||||
while (i < nums.length) {
|
||||
path.add(nums[i]);
|
||||
dfs(nums, i + 1, res, path);
|
||||
path.remove(path.size() - 1);
|
||||
++i;
|
||||
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
|
||||
res.add(new ArrayList<>(t));
|
||||
if (i == nums.length) {
|
||||
return;
|
||||
}
|
||||
for (int j = i; j < nums.length; ++j) {
|
||||
t.add(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.remove(t.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **C++**
|
||||
|
||||
```cpp
|
||||
class Solution {
|
||||
public:
|
||||
vector<vector<int>> subsets(vector<int>& nums) {
|
||||
vector<vector<int>> res;
|
||||
vector<int> t;
|
||||
dfs(0, nums, t, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
|
||||
res.push_back(t);
|
||||
if (i == nums.size()) return;
|
||||
for (int j = i; j < nums.size(); ++j)
|
||||
{
|
||||
t.push_back(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### **Go**
|
||||
|
||||
```go
|
||||
func subsets(nums []int) [][]int {
|
||||
var res [][]int
|
||||
var t []int
|
||||
dfs(0, nums, t, &res)
|
||||
return res
|
||||
}
|
||||
|
||||
func dfs(i int, nums, t []int, res *[][]int) {
|
||||
cp := make([]int, len(t))
|
||||
copy(cp, t)
|
||||
*res = append(*res, cp)
|
||||
if i == len(nums) {
|
||||
return
|
||||
}
|
||||
for j := i; j < len(nums); j++ {
|
||||
t = append(t, nums[j])
|
||||
dfs(j+1, nums, t, res)
|
||||
t = t[:len(t)-1]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **...**
|
||||
|
||||
```
|
||||
|
|
|
|||
|
|
@ -32,9 +32,10 @@
|
|||
<li>All the numbers of <code>nums</code> are <strong>unique</strong>.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
## Solutions
|
||||
|
||||
DFS.
|
||||
|
||||
<!-- tabs:start -->
|
||||
|
||||
### **Python3**
|
||||
|
|
@ -42,15 +43,18 @@
|
|||
```python
|
||||
class Solution:
|
||||
def subsets(self, nums: List[int]) -> List[List[int]]:
|
||||
def dfs(nums, i, res, path):
|
||||
res.append(copy.deepcopy(path))
|
||||
while i < len(nums):
|
||||
path.append(nums[i])
|
||||
dfs(nums, i + 1, res, path)
|
||||
path.pop()
|
||||
i += 1
|
||||
res, path = [], []
|
||||
dfs(nums, 0, res, path)
|
||||
res = []
|
||||
|
||||
def dfs(i, n, t):
|
||||
res.append(t.copy())
|
||||
if i == n:
|
||||
return
|
||||
for j in range(i, n):
|
||||
t.append(nums[j])
|
||||
dfs(j + 1, n, t)
|
||||
t.pop()
|
||||
|
||||
dfs(0, len(nums), [])
|
||||
return res
|
||||
```
|
||||
|
||||
|
|
@ -59,24 +63,75 @@ class Solution:
|
|||
```java
|
||||
class Solution {
|
||||
public List<List<Integer>> subsets(int[] nums) {
|
||||
List<Integer> path = new ArrayList<>();
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
dfs(nums, 0, res, path);
|
||||
dfs(0, nums, new ArrayList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
private void dfs(int[] nums, int i, List<List<Integer>> res, List<Integer> path) {
|
||||
res.add(new ArrayList<>(path));
|
||||
while (i < nums.length) {
|
||||
path.add(nums[i]);
|
||||
dfs(nums, i + 1, res, path);
|
||||
path.remove(path.size() - 1);
|
||||
++i;
|
||||
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
|
||||
res.add(new ArrayList<>(t));
|
||||
if (i == nums.length) {
|
||||
return;
|
||||
}
|
||||
for (int j = i; j < nums.length; ++j) {
|
||||
t.add(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.remove(t.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **C++**
|
||||
|
||||
```cpp
|
||||
class Solution {
|
||||
public:
|
||||
vector<vector<int>> subsets(vector<int>& nums) {
|
||||
vector<vector<int>> res;
|
||||
vector<int> t;
|
||||
dfs(0, nums, t, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
|
||||
res.push_back(t);
|
||||
if (i == nums.size()) return;
|
||||
for (int j = i; j < nums.size(); ++j)
|
||||
{
|
||||
t.push_back(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### **Go**
|
||||
|
||||
```go
|
||||
func subsets(nums []int) [][]int {
|
||||
var res [][]int
|
||||
var t []int
|
||||
dfs(0, nums, t, &res)
|
||||
return res
|
||||
}
|
||||
|
||||
func dfs(i int, nums, t []int, res *[][]int) {
|
||||
cp := make([]int, len(t))
|
||||
copy(cp, t)
|
||||
*res = append(*res, cp)
|
||||
if i == len(nums) {
|
||||
return
|
||||
}
|
||||
for j := i; j < len(nums); j++ {
|
||||
t = append(t, nums[j])
|
||||
dfs(j+1, nums, t, res)
|
||||
t = t[:len(t)-1]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **...**
|
||||
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1,22 +1,20 @@
|
|||
class Solution {
|
||||
public:
|
||||
vector<vector<int>> subsets(vector<int>& nums) {
|
||||
vector<vector<int>> ans;
|
||||
vector<int> tmp;
|
||||
int n = nums.size();
|
||||
dfs(ans,nums,tmp,0,n);
|
||||
|
||||
return ans;
|
||||
vector<vector<int>> res;
|
||||
vector<int> t;
|
||||
dfs(0, nums, t, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
void dfs(vector<vector<int>> &ans,vector<int>& nums,vector<int> &tmp,int k,int n){
|
||||
ans.push_back(tmp);
|
||||
for(int i = k;i < n;i++)
|
||||
|
||||
void dfs(int i, vector<int>& nums, vector<int> t, vector<vector<int>>& res) {
|
||||
res.push_back(t);
|
||||
if (i == nums.size()) return;
|
||||
for (int j = i; j < nums.size(); ++j)
|
||||
{
|
||||
tmp.push_back(nums[i]);
|
||||
dfs(ans,nums,tmp,i+1,n);
|
||||
tmp.pop_back();
|
||||
t.push_back(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -1,21 +1,20 @@
|
|||
func subsets(nums []int) [][]int {
|
||||
n := len(nums)
|
||||
ans := make([][]int,0)
|
||||
tmp := make([]int,0)
|
||||
dfs(&ans,tmp,nums,0,n)
|
||||
|
||||
return ans
|
||||
var res [][]int
|
||||
var t []int
|
||||
dfs(0, nums, t, &res)
|
||||
return res
|
||||
}
|
||||
|
||||
|
||||
func dfs(ans *[][]int,tmp []int,nums []int,k,n int) {
|
||||
tmpVec := make([]int,len(tmp))
|
||||
copy(tmpVec,tmp)
|
||||
*ans = append(*ans,tmpVec)
|
||||
|
||||
for i:=k;i < n;i++{
|
||||
tmp = append(tmp,nums[i])
|
||||
dfs(ans,tmp,nums,i+1,n)
|
||||
tmp = tmp[:len(tmp) - 1]
|
||||
}
|
||||
}
|
||||
func dfs(i int, nums, t []int, res *[][]int) {
|
||||
cp := make([]int, len(t))
|
||||
copy(cp, t)
|
||||
*res = append(*res, cp)
|
||||
if i == len(nums) {
|
||||
return
|
||||
}
|
||||
for j := i; j < len(nums); j++ {
|
||||
t = append(t, nums[j])
|
||||
dfs(j+1, nums, t, res)
|
||||
t = t[:len(t)-1]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,19 @@
|
|||
class Solution {
|
||||
public List<List<Integer>> subsets(int[] nums) {
|
||||
List<Integer> path = new ArrayList<>();
|
||||
List<List<Integer>> res = new ArrayList<>();
|
||||
dfs(nums, 0, res, path);
|
||||
dfs(0, nums, new ArrayList<>(), res);
|
||||
return res;
|
||||
}
|
||||
|
||||
private void dfs(int[] nums, int i, List<List<Integer>> res, List<Integer> path) {
|
||||
res.add(new ArrayList<>(path));
|
||||
while (i < nums.length) {
|
||||
path.add(nums[i]);
|
||||
dfs(nums, i + 1, res, path);
|
||||
path.remove(path.size() - 1);
|
||||
++i;
|
||||
private void dfs(int i, int[] nums, List<Integer> t, List<List<Integer>> res) {
|
||||
res.add(new ArrayList<>(t));
|
||||
if (i == nums.length) {
|
||||
return;
|
||||
}
|
||||
for (int j = i; j < nums.length; ++j) {
|
||||
t.add(nums[j]);
|
||||
dfs(j + 1, nums, t, res);
|
||||
t.remove(t.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +1,15 @@
|
|||
class Solution:
|
||||
def subsets(self, nums: List[int]) -> List[List[int]]:
|
||||
def dfs(nums, i, res, path):
|
||||
res.append(copy.deepcopy(path))
|
||||
while i < len(nums):
|
||||
path.append(nums[i])
|
||||
dfs(nums, i + 1, res, path)
|
||||
path.pop()
|
||||
i += 1
|
||||
res, path = [], []
|
||||
dfs(nums, 0, res, path)
|
||||
return res
|
||||
res = []
|
||||
|
||||
def dfs(i, n, t):
|
||||
res.append(t.copy())
|
||||
if i == n:
|
||||
return
|
||||
for j in range(i, n):
|
||||
t.append(nums[j])
|
||||
dfs(j + 1, n, t)
|
||||
t.pop()
|
||||
|
||||
dfs(0, len(nums), [])
|
||||
return res
|
||||
Loading…
Reference in New Issue