1.全排列(leetcode 46)
- 分析:
对[1,2,3]进行全排列={取出其中一个数字}+对剩余的数字进行全排列,这也就是递归操作。
- 实现:
class Solution {
public:
vector<vector<int>> res;
vector<bool> used;
//
void permute(vector<int>&nums,int index,vector<int>&ans)
{
if(index==nums.size())
{
res.push_back(ans);
return;
}
for(int i=0;i<nums.size();i++)
{
ans.push_back(nums[i]);
permute(nums,index+1,ans);
//回溯操作
ans.pop_back();
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> ans;
permute(nums,0,ans);
return res;
}
};
结果: [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3],[1,3,1],[1,3,2],[1,3,3],[2,1,1],[2,1,2],[2,1,3],[2,2,1],[2,2,2],[2,2,3],[2,3,1],[2,3,2],[2,3,3],[3,1,1],[3,1,2],[3,1,3],[3,2,1],[3,2,2],[3,2,3],[3,3,1],[3,3,2],[3,3,3]]
class Solution {
public:
vector<vector<int>> res;
vector<bool> used;
void permute(vector<int>&nums,int index,vector<int>&ans)
{
if(index==nums.size())
{
res.push_back(ans);
return;
}
for(int i=0;i<nums.size();i++)
{
if(!used[i])
{
ans.push_back(nums[i]);
used[i]=true;
permute(nums,index+1,ans);
//当递归到底时,需要把插入的元素退出,状态恢复原样
ans.pop_back();
used[i]=false;
}
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
//状态变量,判断是否被使用
used=vector<bool>(nums.size(),false);
vector<int> ans;
permute(nums,0,ans);
return res;
}
};
结果:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]