解法:回溯算法
如果我们选择了某个数,那么他的下一层的选择列表就是——除去这个数以外的其他数。
由于不存在重复项,所以选择列表为nums数组本身,可以通过find函数去掉不满足的路径。也可以通过used数组来记录使用过的数字。
class Solution {
public:
void backtrack(vector<int>& track,vector<bool>& used,vector<int> nums){
if(track.size()==nums.size()){ //满足结束条件
res.push_back(track);
return;
}
for(int i=0;i<nums.size();i++){ //选择列表
if(!used[i]){ //若没有访问过
track.push_back(nums[i]); //做选择
used[i]=true;
backtrack(track,used,nums);
track.pop_back(); //撤销选择
used[i]=false;
}
}
}
vector<vector<int>> res; //保存结果
vector<vector<int>> permute(vector<int>& nums) {
vector<int> track; //记录路径
vector<bool> used(nums.size(),false); //标记选择列表
backtrack(track,used,nums); //参数:路径,选择列表,使用过
return res;
}
};