题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路
1.递归回溯
2.注意去重复
3.类似leetcode46. 全排列
实现
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
do_switch(nums, res, 0, len);
return res;
}
//num[target]是否和num[start] ~ num[end]中的任何一个数一样,如果一样的话,swap之后也没有任何变化,说明没有必要swap
bool check_same(vector<int> &num, int start, int end, int target) {
for(int i = start; i <=end; ++i) {
if (num[i] == num[target])
return true;
}
return false;
}
void do_switch(vector<int>& nums, vector<vector<int>>& res, int index, int len){
if (index == len) {
res.push_back(nums);
}
for (int i = index; i < len; i++) {
//如果有两个元素交换后的效果一致,则停止交换。
if (check_same(nums, index, i - 1, i)) continue;
int tmp = nums[index];
nums[index] = nums[i];
nums[i] = tmp;
do_switch(nums, res, index + 1, len);
tmp = nums[index];
nums[index] = nums[i];
nums[i] = tmp;
}
}
};