思路:本题是典型的回溯问题,需要列举出每个排列,因此使用回溯法,对每个使用过的元素进行标记,因此需要一个和Nums同样大的标记数组,每个元素被使用之后在递归之前将其标记为已使用,在递归的时候该元素就不会参与统计,同理,在回溯递归回退的时候,需要对当前的元素的标记位置改回false,以便下一次遍历使用。
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
// 每次将path加入到res中
void dfs(vector<int> &nums, vector<bool> &used)
{
// 如果找到了一组就直接加入结果数组中
if(path.size() == nums.size())
{
res.push_back(path);
return;
}
for(int i = 0;i < nums.size();++i)
{
// 如果当前数据被使用过了就继续寻找下一个
if(used[i] == true)
continue;
// 已经被使用过的元素标记
used[i] = true;
path.push_back(nums[i]);
dfs(nums, used);
// 回溯
path.pop_back();
// 一次遍历完之后,将当前数据置为false
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums)
{
vector<bool> used(nums.size(), false);
dfs(nums, used);
return res;
}
};