题目:
For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].
题意:这道题相对于第46道题的变化是数组里面会有重复出现的元素,所以结题思路需要稍微变化。
思路:比如[-1,2,0,-1,1,0,1]这样数组,我们考虑第一位上可以放的数据一共有-1,0,1,2这四种,如果第一位上是-1,那么第二位上可以放的就剩下0,1,2这三种.依旧采用回溯的思路,让每个位置放上所有可能的值。具体代码如下:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() == 0)return result;
if(nums.size() == 1){
result.push_back(nums);
return result;
}
sort(nums.begin(),nums.end());
getAllPermutation(result,nums,0);
return result;
}
void getAllPermutation(vector<vector<int>>& result,vector<int>& nums,int i){
if(i == nums.size() - 1){
result.push_back(nums);
return;
}
getAllPermutation(result,nums,i+1);
int last = nums[i];
for(int j = i + 1; j < nums.size(); j++){
if(nums[j] != nums[i] && nums[j] != last){
last = nums[j];
swap(nums[i],nums[j]);
getAllPermutation(result,nums,i+1);
swap(nums[i],nums[j]);
}
}
}
};