AcWing 51. 数字排列
原题链接
中等
作者:
owonder
,
2020-08-06 22:41:36
,
所有人可见
,
阅读 456
C++ 代码
class Solution {
public:
vector<vector<int>> datas;
vector<vector<int>> permutation(vector<int>& nums) {
if(nums.empty()){
return {};
}
sort(nums.begin(),nums.end());
vector<bool> visitor(nums.size(),false);
vector<int> candidates;
dfs( nums,candidates,visitor);
return datas;
}
void dfs(vector<int>& nums,vector<int>& candidates,vector<bool>&visitor){
if(candidates.size()==nums.size()){
datas.push_back(candidates);
return;
}
for(int i=0;i<nums.size();i++){
//感觉比较难理解的是这里的两个判断吧,这个是第二次循环时候,前一个循环选择他
if(visitor[i]){
continue;
}
//这个表示一轮已经选完了,就是一棵树的一条边走完了
if(i>0&&nums[i]==nums[i-1]&&!visitor[i-1]){
continue;
}
visitor[i]=true;
candidates.push_back(nums[i]);
dfs( nums,candidates,visitor);
candidates.pop_back();
visitor[i]=false;
}
return ;
}
};