- 分析
这道题要比46题要难,主要难在nums可能会有重复的数字,因为有重复的数字,所以为了标识哪个数字被选择可以用一个bool数组来记录一下,在做选择和撤销选择的时候需要同步,需要注意的是for循环里面做选择的条件,画出决策树之后就很好理解了。 - 代码
class Solution {
public:
vector<vector<int>> vec;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> road;
vector<bool> judge(nums.size(), false);
backtrack(nums, road, judge);
return vec;
}
void backtrack(vector<int>& nums, vector<int>& road, vector<bool>& judge){
if(road.size() == nums.size()){
vec.push_back(road);
return;
}
for(int i = 0; i < nums.size(); i++){
int data = nums[i];
if(judge[i] || (i > 0 && nums[i] == nums[i - 1] && !judge[i - 1])) continue;
judge[i] = true;
road.push_back(data);
backtrack(nums, road, judge);
road.pop_back();
judge[i] = false;
}
}
};