问题描述
排列问题的难点在于排列要求有序,并且在写的时候发现,如何在选择后面的元素后回过头去选择前面的元素,这是很难处理的,在前面的组合问题中,我们都是用startindex来处理,而在这里就行不通了。
容易想到的一种解决方法就是另外设置一个与nums长度相同的used数组来记录元素的遍历情况,也很难想到更合适的办法了。
试着写出代码如下:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
//int uesd[nums.size()] = {0};
void backtrace(vector<int>& nums, vector<int>& used){
if(path.size() == nums.size()){
res.push_back(path);
return ;
}
for(int i = 0; i < nums.size(); i++){
if(used[i]){
continue;
}
path.push_back(nums[i]);
used[i] = 1;
backtrace(nums,used);
path.pop_back();
used[i] = 0;
}
}
vector<vector<int>> permute(vector<int>& nums) {
res.clear();
path.clear();
vector<int> used;
for(int i = 0; i < nums.size(); i++){
used.push_back(0);
}
backtrace(nums, used);
return res;
}
};
大体上还是沿用回溯法的三部曲分析。
标签:排列,nums,res,used,力扣,vector,回溯,path,size From: https://www.cnblogs.com/satsuki26681534/p/18062911