方法:回溯 + 剪枝
代码:(还可以有优化空间)
class Solution47 {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
/* 做一个排序 */
sort(nums.begin(), nums.end());
return recursion(nums);
}
vector<vector<int>> recursion(vector<int> &nums) {
int cur_val = nums[0];
if (1 == nums.size()) {
return { {cur_val} };
}
vector<vector<int>> out;
for (int i = 0; i < nums.size();) {
cur_val = nums[i];
nums.erase(nums.begin() + i);
vector<vector<int>> tmps = recursion(nums);
nums.insert(nums.begin() + i, cur_val);
for (int j = 0; j < tmps.size(); j++) {
tmps[j].push_back(cur_val);
out.push_back(tmps[j]);
}
while (i < nums.size()) {
if (nums[i] != cur_val)
break;
i++;
}
}
return out;
}
};