全排列去重的前提要求是目标集合必须是经过排序的。
在目标集合排序的前提下,第i位变换数字前后,如果是相同的数字,就会产生重复的排列。
注意:第i位变换的意思是i位本身的变换,而不是i与i-1的比较。
代码如下:
void dfs(const vector<int>& nums, int pos, vector<vector<int>>& result, vector<int>& cur) {
if (pos == nums.size()) {
result.push_back(cur);
return;
}
for (int i = 0; i < nums.size(); ++i) {
// 控制i位 and 全排列去重
if (Visited[i] || (i > 0 && nums[i] == nums[i - 1] && !Visited[i - 1])) {
continue;
}
Visited[i] = true;
cur.push_back(nums[i]);
dfs(nums, pos + 1, result, cur);
cur.pop_back();
Visited[i] = false;
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
vector<int> cur;
// 全排列去重的关键是排序过的集合
sort(nums.begin(), nums.end());
dfs(nums, 0, result, cur);
return result;
}
标签:排列,cur,nums,vector,result,Visited
From: https://www.cnblogs.com/linukey/p/17417241.html