Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
思路:相比于前一个,多了一个去重复的条件
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
vector<int> path;
vector<int> record(nums.size(),0);
sort(nums.begin(), nums.end());
scan(record, path, nums, res);
return res;
}
void scan(
vector<int> &record,
vector<int> &path,
vector<int>& nums,
vector<vector<int>> &res
){
if (path.size() == nums.size()){
res.push_back(path);
}
for (int i = 0; i < nums.size(); i++){
if (record[i] == 0){ //当前数字还没有被使用
if (i>0 && nums[i] == nums[i - 1]&&record[i-1]==0){ //这里去重复,首先要排序,如果相邻相等,而且前一个被用过了,这个才可以开始用,否则继续
continue;
}
record[i] = 1;
path.push_back[nums[i]];
scan(record, path, nums,res);
path.pop_back();
record[i] = 0;
}
}
}
};