全排列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]);}}};
