16.47.全排列 II
·
思路:
回溯暴搜。和前一题的区别在于集合中是否有相同的元素。
排序后去重。
储备:
问题重点:
1、相同的数字在同一个位置不能重复使用。所以要跳过
2、没有用used判断的话是这样的情况,因为一会树层去重一会树枝去重就全都跳过了:


数层去重和树枝去重为何可行,你看一眼这两个图就知道了。
3、关键在于在for循环里的所有操作里加了个if
4、
如果要对树层中前一位去重,就用
used[i - 1] == false,如果要对树枝前一位去重用
used[i - 1] == true。
最后:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void search(vector<int>& nums, vector<bool>& used) {
if (nums.size()==path.size()) {
res.push_back(path);
return ;
}
for (int i=0;i<nums.size();i++) {
// if (i>0 && nums[i-1]==nums[i] && used[i-1]==true) continue;//如果相同数字在这条路径之前用过了
if (i>0 && nums[i-1]==nums[i] && used[i-1]==false) continue;//如果相同数字在这层递归之前用过了
if (used[i]==false) {//如果这一位没用过,才能放进来。排除掉自身
used[i]=true;
path.push_back(nums[i]);
search(nums,used);
used[i]=false;
path.pop_back();
}
}
return ;
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> used(nums.size(),false);
search(nums,used);
return res;
}
};
更多推荐
所有评论(0)