- 设计思想:
-视频讲解链接B站视频讲解
- 复杂度分析:
- 代码:
c++版本:
class Solution {
public:
vector<int> temp;//临时存储作用
vector<vector<int>> res;//用于存储结果
/*
k 代表temp每次最多存储几个,index代表遍历到哪个位置,S代表给你的数组
*/
void dfs(int k,int index,vector<int> &S){
if(k == temp.size()){//当temp数组的存放长度等于k的时候就把temp丢进res里面
res.push_back(temp);
return ;
}
//进行子集的遍历
for(int i = index;i < S.size();i ++){
temp.push_back(S[i]);//放入当前数
dfs(k,i + 1,S);//下一个位置的递归
temp.pop_back();//回溯到上一个位置
}
}
vector<vector<int> > subsets(vector<int> &S) {
res.push_back(temp);//首先放入空集
for(int i = 1;i <= S.size();i ++){//i用来表示每次返回几个长度的子集,如 i = 1返回长度为1的子集
dfs(i,0,S);
}
return res;
}
};
Java版本:
import java.util.*;
public class Solution {
List<Integer> temp = new ArrayList<>();//临时存储作用
ArrayList<ArrayList<Integer> > res = new ArrayList<>();//用于存储结果
/*
k 代表temp每次最多存储几个,index代表遍历到哪个位置,S代表给你的数组
*/
public void dfs(int k,int index,int []S){
if(k == temp.size()){//当temp数组的存放长度等于k的时候就把temp丢进res里面
res.add(new ArrayList<>(temp));
return ;
}
//进行子集的遍历
for(int i = index;i < S.length;i ++){
temp.add(S[i]);//放入当前数
dfs(k,i + 1,S);//下一个位置的递归
temp.remove(temp.size()-1);//回溯到上一个位置
}
}
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
res.add(new ArrayList<>(temp));//首先放入空集
for(int i = 1;i <= S.length;i ++){//i用来表示每次返回几个长度的子集,如 i = 1返回长度为1的子集
dfs(i,0,S);
}
return res;
}
}Python版本:
#
#
# @param A int整型一维数组
# @return int整型二维数组
#
class Solution:
def subsets(self , S ):
# write code here
res = []
'''
k 代表temp每次最多存储几个,index代表遍历到哪个位置,S代表给你的数组
'''
def dfs(k,index,S,temp):
if k == len(temp) :#当temp数组的存放长度等于k的时候就把temp丢进res里面
res.append(temp.copy())
return
#进行子集的遍历
for i in range(index,len(S)):
temp.append(S[i])#放入当前数
dfs(k,i + 1,S,temp)#下一个位置的递归
temp.pop()#回溯到上一个位置
for i in range(0,len(S) + 1):#i用来表示每次返回几个长度的子集,如 i = 1返回长度为1的子集
dfs(i,0,S,[])
return resJavaScript版本:
/**
*
* @param A int整型一维数组
* @return int整型二维数组
*/
function subsets(S) {
// write code here
const res = [];//用于存储结果
const dfs = (k, index,temp) => {
if(temp.length == k){//当temp数组的存放长度等于k的时候就把temp丢进res里面
res.push(temp);
return;
}
//进行子集的遍历
for(let i = index; i < S.length; i++){
dfs(k, i+1,temp.concat(S[i]));//下一个位置的递归
}
}
for(let i = 0; i <= S.length; i++){//i用来表示每次返回几个长度的子集,如 i = 1返回长度为1的子集
dfs(i,0,[]);
}
return res
}
module.exports = {
subsets : subsets
};
京公网安备 11010502036488号