- 题目描述:
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 - 解题思路:看到这题的时候首先是与之前的全排列解法类似,但是之前的全排列是没有重复的的元素的,所以只需要在使用前判断used数组中对应的值是否是false,但是这题必须还要判断当时的值是否与上一个值相同,如果相同且上一个值没被用过这样必须直接跳过这个值,因为如果此时的值与上一个相同且上一个值没被用过,如果直接用这个数那么得到的这个排列肯定会和上一个排列有重合的地方。
- 解题代码:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
vector<int> current;
vector<bool> used (nums.size(),false);
if(nums.size() == 1){
res.push_back({nums[0]});
return res;
}
backtracking(res,current,used,nums);
return res;
}
void backtracking(vector<vector<int>>& res,vector<int> ¤t,vector<bool>& used,vector<int> nums){
if(current.size() == nums.size()){
res.push_back(current);
return;
}
for(int i = 0; i < nums.size(); i++){
if(i>0 && nums[i] == nums[i-1] && used[i-1] == false){
continue;
}
if(used[i] == true){
continue;
}
used[i] = true;
current.push_back(nums[i]);
backtracking(res,current,used,nums);
current.pop_back();
used[i] = false;
}
}
};
- tips:
面对有重复值得排列组合等问题,一般都是先进行sort排序,然后进行后续得操作。