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]
]
题目大意:
给一个数组含有重复数字,找出他们所有不重复的全排列。
解法:
使用回溯法,使用一个visited数组记录数组是否包含该数字,但是在去除重复方面出现了问题。
我的C++代码:
class Solution { private: void dfs(vector<int>&nums,vector<bool>&visited,vector<int>&tmp,vector<vector<int>>&res){ if(tmp.size()==nums.size()) res.push_back(tmp); for(int i=0;i<nums.size();i++){ if(i>0 && nums[i]==nums[i-1]) continue; if(visited[i]) continue; visited[i]=true; tmp.push_back(nums[i]); dfs(nums,visited,tmp,res); visited[i]=false; tmp.pop_back(); } } public: vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>>res; vector<int>tmp; vector<bool>visited(nums.size(),false); dfs(nums,visited,tmp,res); return res; } };
别人实现的C++:
将每一个数字和这个数字之后的数字进行交换,形成一个排列,其中dfs函数中的vector<int>nums参数一定不能加上&参数。
其中的if(i!=k && nums[k]==nums[i]) continue;语句控制重排序。
class Solution { private: void dfs(vector<int>nums,int i,vector<vector<int>>&res){ if(i==nums.size()-1){ res.push_back(nums); return; } for(int k=i;k<nums.size();k++){ if(i!=k && nums[k]==nums[i]) continue; swap(nums[i],nums[k]); dfs(nums,i+1,res); } } public: vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>>res; dfs(nums,0,res); return res; } };