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. 全排列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.