题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
来源,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;
}
};