多了重复的元素,可以先通过排序,如果当前元素和之前元素相同,且之前的元素没有被visit过,说明前一个元素已经访问过并重新置为没访问过,所以这种情况需要continue。
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>> res; vector<int> cur; vector<bool> visited(nums.size(),false); dfs(nums,cur,visited,res); return res; } void dfs(vector<int>& nums, vector<int> &cur, vector<bool> visited, vector<vector<int>> &res){ if (cur.size()==nums.size()){ res.push_back(cur); return; } for (int i=0;i<nums.size();++i){ if (!visited[i]){ if (i>=1 && nums[i]==nums[i-1] && !visited[i-1]) continue; //if !visited, means has been permutated visited[i]=true; cur.push_back(nums[i]); dfs(nums,cur,visited,res); visited[i]=false; cur.pop_back(); } } } };
也可以用之前I的第二种方法,交换,这样就不用排序了,但是为了防止重复的答案,所以需要set
class Solution { public: vector<vector<int>> permuteUnique(vector<int> &nums) { set<vector<int>> res; dfs(nums,0,res); return vector<vector<int>>(res.begin(),res.end()); } void dfs(vector<int> &nums, int start, set<vector<int>> &res) { if (start == nums.size()){ res.insert(nums); return; } // permute num[start..end()] for (int i=start;i<nums.size();++i){ if (i!=start && nums[i]==nums[start]) continue; swap(nums[start],nums[i]); dfs(nums,start+1,res); swap(nums[start],nums[i]); } } };