class Solution {
public:
vector<vector<int>>res;
vector<bool>used;//判断当前情况下第i个节点是否被使用过
void generatePermutation(const vector<int>& nums,int index,vector<int>& p)
{
//nums表示备选数字集合,index表示当前正在处理第几个元素,p指的是在递归的过程中已经生成的排列
//p中保存了一个有index个元素的排列
//向这个排列的末尾添加第index+1个元素,获得一个有index+1个元素的排列
if(index==nums.size()){
res.push_back(p);
return;
}
//递归逻辑部分
for(int i=0;i<nums.size();i++)
{
//找到第index+1个元素,但是你下一次访问的并且需要添加的元素不能是已经添加过的
//也就是不能在当前节点递归树节点的祖先节点
if(!used[i])
{
//如果这个数字没有被使用
//将nums[i]添加在p中
p.push_back(nums[i]);
used[i]=true;
generatePermutation(nums,index+1,p);
p.pop_back();
used[i]=false;//向上回溯寻找下一个排列将本节点所代表数字复原为未访问,然后继续下一轮循环
//找到剩下的全排列
}
}
return;//结束调用
}
vector<vector<int>> permute(vector<int>& nums) {
res.clear();
if(nums.size()==0)
{
return res;
}
used=vector<bool>(nums.size(),false);
vector<int>p;
generatePermutation(nums,0,p);
return res;
}
};
回溯思想应用:002.LeetCode:46. 全排列
最新推荐文章于 2024-07-12 22:23:23 发布