对于需要在递归过程中去重的,判断是否在同一条分支上进行去重(纵向)。
// 递归过程中针对同一分支去重的方式一,需要把set从顶层往下传,要求原序列中的元素不重复
unordered_set<int> duplicate;
dfs(..., duplicate, ...);
...
void dfs(..., unordered_set<int> & duplicate, ...){
...
for (...){
if (duplicate.find(nums.at(i)) != duplicate.end()){
continue;
}
duplicate.insert(nums.at(i)); //加入去重列表
dfs(..., duplicate, ...);
duplicate.erase(nums.at(i)); // 分支去重,需要回溯
}
}
// 递归过程中针对同一分支去重的方式二
vector<bool> isVisited(nums.size(), false);
dfs(..., isVisited, ...);
...
void dfs(..., vector<bool> & isVisited, ...){
...
for (...){
if (isVisited.at(i) == true){
continue;
}
isVisited.at(i) = true; // 标记为已访问
dfs(..., duplicate, ...);
isVisited.at(i) = false; // 分支去重,需要回溯
}
}