class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &nums) {
vector<vector<int> > results;
if (nums.size() == 0) {
results.push_back(vector<int>());
return results;
}
sort(nums.begin(), nums.end());
vector<bool> visited(nums.size(), false);
vector<int> current;
dfsHelper(nums, current, visited, results);
return results;
}
void dfsHelper(vector<int> &nums, vector<int>& current, vector<bool>& visited, vector<vector<int> >& results) {
if (nums.size() == current.size()) {
results.push_back(current);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (visited[i]) {
continue;
}
if (i > 0 && nums[i - 1] == nums[i] && !visited[i - 1]) {
continue;
}
current.push_back(nums[i]);
visited[i] = true;
dfsHelper(nums, current, visited, results);
current.pop_back();
visited[i] = false;
}
}
};