https://leetcode.com/problems/permutations-ii/
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
permutation I中nums中的元素是两两不同的,所以任意一种排列方式都是合法的,但是这个问题中就不行。同时如果使用之前的swap的方法,会导致后半部分的数列的有序性被破坏,对于重复元素没法处理。
所以使用最传统的visited数组标记的方法,这样一来也更容易注意到,避免重复的排列方式本质上就是要求不同位置的相同数字的相对顺序不发生变化(因为相同数字的任意排列都是等价的),在深搜遍历的时候保证这一性质是容易的。
参考:https://segmentfault.com/a/1190000009513703
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool> visited(nums.size(), false);
vector<int> inter_nums;
sort(nums.begin(), nums.end());
dfs(nums, visited, inter_nums);
return result;
}
void dfs(vector<int> &nums, vector<bool> &visited, vector<int> &inter_nums){
if(inter_nums.size() == nums.size()){
result.push_back(inter_nums);
}else{
for(int i = 0; i < nums.size(); ++i){
if(visited[i]) continue;
if(i != 0 && nums[i-1] == nums[i] && !visited[i-1]) continue; //保证相同数字之间的有序性
visited[i] = true;
inter_nums.push_back(nums[i]);
dfs(nums, visited, inter_nums);
inter_nums.pop_back();
visited[i] = false;
}
}
}
};