全排列II
题目链接:https://leetcode-cn.com/problems/permutations-ii/submissions/
思路:递归的本质是在调用自身的同时缩小问题规模,直到终止条件。基于这一点,才能够理解为什么要在每一次swap之前先检查在这一级递归中是否已经swap过相同的数字——因为对于同一规模的子问题,如果其包含的数字相同而只是顺序不同,其最后产出的结果也是重复的。
参考代码:
class Solution {
private:
vector<vector<int>> res;
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
if (nums.size() == 0) {
return res;
}
recursivePermuteUnique(nums, 0);
return res;
}
void recursivePermuteUnique(vector<int>& nums, int index) {
if (index == nums.size() - 1) {
res.push_back(nums);
return;
}
unordered_set<int> dup;
for (int i = index; i <= nums.size() - 1; ++i) {
if (dup.find(nums[i]) != dup.end()) {
continue;
}
dup.insert(nums[i]);
swap(nums[i], nums[index]);
recursivePermuteUnique(nums, index + 1);
swap(nums[i], nums[index]);
}
}
};