排列问题也是属于回溯的解决范围。我们照常画出树形结构来辅助我们理解。
由这个树形结构我们知道,以集合{1,2,3}举例,他的全排列的结果集里面会包含集合{1,3,2}还会包含{3,2,1},因此我们可以发现,在符合要求的结果里面,元素并不是有序的,1可以在3的后边,不必非得在3的前边,因此我们呢就不需要startindex这个变量了。而由于出于去重的需要,我们还需要使用used数组来辅助去重,初始化used都是false,如果当前的索引i对应的used[i]=true,很简单,直接跳过就行。代码如下:
vector<int>path;
vector<vector<int>>res;
void backtrack(vector<int>&num,vector<bool>&used)
{
if(path.size()==num.size())
{
res.push_back(path);
return ;
}
for(int i=0;i<num.size();i++)
{
if(used[i]==true)continue;
path.push_back(num[i]);
used[i]=true;
backtrack(num,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool>used(nums.size(),false);
backtrack(nums,used);
return res;
}