全排列问题
题目描述:
给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以按任意顺序返回答案。
如给定[1,2,3],返回[1,2,3] [1,3,2] [2,1,3] [2,3,1] [3,2,1] [3,1,2]
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
backtrack(res,nums,0,nums.size());
return res;
}
void backtrack(vector<vector<int>>& res,vector<int>& output,int first,int len){
if(first==len){
res.emplace_back(output);
return;
}
for(int i=first;i<len;++i){
swap(output[i],output[first]);
backtrack(res,output,first+1,len);
swap(output[i],output[first]);
}
}
};
子集问题
1、元素互不相同,因此不用考虑去重的问题
2、子集的个数,有2的n次方个,n是数组元素个数。
3、其含义是对于每一个元素,都有放入子集和不放入子集2种选择
4、用回溯法模拟此选择过程即可
5、时间复杂度O(2的n次方),空间复杂度O(n),即递归深度
class Solution {
private:
vector<vector<int>> ans;
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
vector<int> subset;
dfs(nums,subset,0,n);
return ans;
}
void dfs(vector<int>& nums,vector<int> subset,int k,int n){
if(k==n){
ans.emplace_back(subset);
return;
}
else{
subset.push_back(nums[k]);
dfs(nums,subset,k+1,n);
subset.pop_back();
dfs(nums,subset,k+1,n);
}
}
};