Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析:
本题和八皇后问题类似,都是通过递归不断访问下一个。如下图,
最后分别用Python和C++实现的代码。
Python
class Solution(object):
def subsets(self, nums):
result=[]
def dfs(lst, nums, pos): #pos就是lst的尾巴
result.append(lst[:]) #这里是复制
for i in range(pos,len(nums)):
lst.append(nums[i])
dfs(lst,nums,i+1)
lst.pop() #返回树的上一层
dfs([],nums,0)
return result
c++ 方法一:
class Solution {
public:
//使用深度优先的回溯法
vector<vector<int>> subsets(vector<int>& nums) {
//套路操作一:建立存储数组
vector<vector<int>> result;
vector<int> path;
//套路操作二:排序,减少遍历复杂度
sort(nums.begin(),nums.end());
result.push_back(path);
dfs(nums,0,path,result);
return result;
}
void dfs(vector<int>& nums,int pos,vector<int> & path,vector<vector<int>> & result)
//num是给定的待求数组
{
if(pos==nums.size())
return;
//类似八皇后的操作
//详情可查看:https://blog.csdn.net/lyly1995/article/details/87867340
for(int i=pos;i<nums.size();i++)
{
path.push_back(nums[i]);
result.push_back(path);
dfs(nums,i+1,path,result);
path.pop_back();
}
}
};
c++方法二
1、不对数组进行排序,而是借助一个数组记录已访问的元素
2、在最后遍历完成在输出/存储数组
class Solution {
public:
int used[1000000];
void search(vector<int>& nums,int idx,vector<int> & path,vector<vector<int>> & result)
{
if(idx>=nums.size()){
for(int i=0;i<nums.size();i++)
{
if(used[i]==1)
path.push_back(nums[i]);
}
result.push_back(path);
path.clear();
return;
}
used[idx]=1;
search(nums,idx+1,path,result);
used[idx]=0;
search(nums,idx+1,path,result);
}
vector<vector<int>> subsets(vector<int>& nums) {
memset(used,0,sizeof(used));
vector<vector<int>> result;
vector<int> path;
search(nums,0,path,result);
return result;
}
};