回溯Leetcode47全排列II
- 创业
- 2025-08-03 08:06:02

全排列II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
Leetcode 47
学习记录自代码随想录
示例 1: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
示例 2: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示: 1 <= nums.length <= 8 -10 <= nums[i] <= 10
要点:1.需要两层去重,既要树层去重也要在同一树枝去重; 2.可以只使用used进行树层去重或者单独使用used进行树枝去重,而uset进行树层去重; 3.组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果。 4.树层去重相比于树枝去重较高;
class Solution { private: vector<int> path; vector<vector<int>> result; void backtracking(vector<int>& nums, vector<int> used){ if(path.size() == nums.size()){ result.push_back(path); return; } unordered_set<int> uset; for(int i = 0; i < nums.size(); i++){ // if(used[i] == 1 || (i > 0 && used[i-1] == 0 && nums[i] == nums[i-1])){ // continue; // } if(used[i] == 1 || uset.find(nums[i]) != uset.end()){ continue; } uset.insert(nums[i]); used[i] = 1; path.push_back(nums[i]); backtracking(nums, used); path.pop_back(); used[i] = 0; } } public: vector<vector<int>> permuteUnique(vector<int>& nums) { path.clear(); result.clear(); // sort(nums.begin(), nums.end()); // 树层去重 要排序 vector<int> used(nums.size(), 0); backtracking(nums, used); return result; } };回溯Leetcode47全排列II由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“回溯Leetcode47全排列II”