思路:本题是典型的回溯问题,需要列举出每个排列,因此使用回溯法,对每个使用过的元素进行标记,因此需要一个和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();// 一次遍历完之后,将当前数据置为falseused[i] = false;} }vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(), false);dfs(nums, used);return res;}
};