题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
来源,leetcode 每日一题 47. 全排列 II
例如:
给定二叉树 [3,9,20,null,null,15,7],
输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]
解题思路
- 回溯法:每个位置每个数字都可能出现,但是由于同一个数字不能重复出现,如何判定不能重复出现:使用一个
visited数组记录一下访问到的数字,同时回溯前要重置一下。 - 去重:要保证每次都是从左边第一个未使用过的数字开始使用,则可以保证不会有重复的数组出现。
代码
class Solution {vector<int> visited;public:void dfs(vector<vector<int>>& result, int idx, vector<int>& nums, vector<int>&perms) {if (idx == nums.size()) {result.emplace_back(perms);return;}for (int i = 0; i < nums.size(); i++) {if (visited[i] || (i > 0 && nums[i] == nums[i-1] && !visited[i-1])) {continue;}perms.emplace_back(nums[i]);visited[i] = 1;dfs(result, idx+1, nums, perms);visited[i]=0;perms.pop_back();}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<vector<int>> result;vector<int> perms;visited = vector<int>(nums.size());sort(nums.begin(), nums.end());dfs(result, 0, nums, perms);return result;}};
