一:全排列
1.1题目

题目链接:https://leetcode.cn/problems/permutations/description/
1.2算法原理

1.3代码
cpp
class Solution {
public:
vector<vector<int>> ret;
vector<int> path;
bool check[7] = {false};//用来判断这个下标所对应的数字是否已经使用了
vector<vector<int>> permute(vector<int>& nums)
{
dfs(nums);
return ret;
}
void dfs(vector<int>& nums)
{
if(path.size() == nums.size())
{
ret.push_back(path);
return;
}
for(int i = 0; i < nums.size();i++)
{
if(!check[i])
{
path.push_back(nums[i]);
check[i] = true;
dfs(nums);
//回溯:恢复现场
path.pop_back();
check[i] = false;
}
}
}
};
二:子集
2.1题目

题目链接:https://leetcode.cn/problems/subsets/description/
2.2算法原理

2.3代码
解法一:pos位置的数字是选还是不选
cpp
class Solution {
public:
vector<vector<int>> ret = {};
vector<int> path;
vector<vector<int>> subsets(vector<int>& nums)
{
dfs(nums,0);
return ret;
}
void dfs(vector<int>& nums,int pos)
{
if(pos == nums.size())
{
ret.push_back(path);
return;
}
//选pos位置的数字
path.push_back(nums[pos]);
dfs(nums,pos+1);
path.pop_back();
//不选pos位置的数字
dfs(nums,pos+1);
}
};
解法二:只选择pos及之后的数字
cpp
class Solution {
public:
vector<vector<int>> ret;
vector<int> path;
vector<vector<int>> subsets(vector<int>& nums)
{
dfs(nums,0);
return ret;
}
void dfs(vector<int>& nums,int pos)
{
ret.push_back(path);
for(int i = pos;i < nums.size();i++)
{
path.push_back(nums[i]);
dfs(nums,i+1);
path.pop_back();
}
}
};