全排列II
    题目链接:https://leetcode-cn.com/problems/permutations-ii/submissions/
    图片.png
    思路:递归的本质是在调用自身的同时缩小问题规模,直到终止条件。基于这一点,才能够理解为什么要在每一次swap之前先检查在这一级递归中是否已经swap过相同的数字——因为对于同一规模的子问题,如果其包含的数字相同而只是顺序不同,其最后产出的结果也是重复的。

    参考代码:

    1. class Solution {
    2. private:
    3. vector<vector<int>> res;
    4. public:
    5. vector<vector<int>> permuteUnique(vector<int>& nums) {
    6. if (nums.size() == 0) {
    7. return res;
    8. }
    9. recursivePermuteUnique(nums, 0);
    10. return res;
    11. }
    12. void recursivePermuteUnique(vector<int>& nums, int index) {
    13. if (index == nums.size() - 1) {
    14. res.push_back(nums);
    15. return;
    16. }
    17. unordered_set<int> dup;
    18. for (int i = index; i <= nums.size() - 1; ++i) {
    19. if (dup.find(nums[i]) != dup.end()) {
    20. continue;
    21. }
    22. dup.insert(nums[i]);
    23. swap(nums[i], nums[index]);
    24. recursivePermuteUnique(nums, index + 1);
    25. swap(nums[i], nums[index]);
    26. }
    27. }
    28. };