题目大意
给定一个包含重复元素的数组,求全排列。
分析
- 为了做这道题,首先要理清求全排列的本质,实际上求全排列就是固定前面的数,然后对后面的数进行求解,比如一开始的时候选择第一个数,然后对剩下的数进行全排列,这样相当于转换为一个子问题,递归求解。
- 那么对于这个问题,假设我们有1,1,3,4四个数,那么对于第一个位置,首先把1放置到这个位置,然后对剩余三个数进行全排列,接下来考虑第二个1时,没有必要放到第一个位置,因为这二者等价。
- 但是对于给定的数,需要给定有序,否则会出现重复的情况,比如[1,2,1],当我们把2换到第一个位置的时候,求解完之后的全排列,由于第一个位置是2,那么第三个位置的1是可以换到第一个位置的,而这种情况出现过,会重复计算。
代码
vector<vector<int>> ans;
void dfs(vector<int> nums, int left, int right) {
if(left == right) {
ans.push_back(nums);
} else {
for(int i = left; i <= right; i++) {
if(i != left && nums[left] == nums[i]) {
continue;
}
swap(nums[left], nums[i]);
dfs(nums, left + 1, right);
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
dfs(nums, 0, nums.size() - 1);
return ans;
}