class Solution
{
public:
vector<vector<int>> permute(vector<int>& nums)
{
vector<int> track;
backtrack(nums, track);
return res;
}
private:
void backtrack(vector<int>& nums, vector<int>& track)
{
// 1、结束条件
if (nums.size() == track.size())
{
res.push_back(track);
return;
}
//该循环是整个代码的核心 + 难点
for (int i = 0; i < nums.size(); i++)
{
// 1、排除不合法的选择
if (finds(track, nums[i])) continue;
// 2、做选择
track.push_back(nums[i]);
// 3、进入下一层决策树
backtrack(nums, track);
// 4、取消选择
track.pop_back();
}
}
bool finds(vector<int>& track, int num)
{
for (vector<int>::iterator it = track.begin(); it != track.end(); it++)
{
if (*it == num) return true;
}
return false;
}
public:
vector<vector<int>> res;
};
在刚开始看先序遍历递归的时候,我也是很迷糊,主要玄机在递归所在的 for 循环语句中,要时刻明白递归与回溯时 for 循环所处的状态,也就是 for 循环执行到了哪一步;如果 for 循环没有没有执行到结束条件,回溯后会接着执行当前 for 循环(此处也是整个全排列的核心);