题目:
46.全排列
题解:
注:本题思路来自:labuladong的回溯算法详解
对于回溯算法,需要知道可以进行的选择列表choiceList以及决策路径track(即已经做出一系列选择)。对于如何让计算机正确地穷举并比较所有决策,就需要回溯算法的设计技巧了,回溯算法的核心就在于如何设计 choose 和 unchoose 部分的逻辑。
全排列中的选择列表:每次选择的一个数 决策路径:就是加上选择的这个数。 伪代码:
代码如下:
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { if(nums.empty()) return {}; vector<vector<int>> result; vector<int> track; backtrack(nums,track,result); return result; } void backtrack(vector<int>& nums,vector<int>& track,vector<vector<int>>& result) { if(nums.size()==0)//选择列表已空,即已经完成一个全排列 result.push_back(track); else{ for(int i=0;i<nums.size();++i) { /*choose过程*/ int n=nums[i]; //用变量存起来 track.push_back(n); //加入到决策路径的最后 nums.erase(nums.begin()+i); //擦除这个选择 /*进入下一步决策*/ backtrack(nums,track,result); /*unchoose过程*/ nums.insert(nums.begin()+i,n); //把这个选择在插回去 track.pop_back(); //决策中移除这个选择 } } } };