全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
包含重复数字,返回不重复排列。那就是说相同的数字不能用两次,而不是说相同值的数字不能用两遍。
我们将组合总和Ⅱ中的去重操作同排列问题中的访问标记数组used相结合。
代码如下:
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
void dfs(vector<int>& used,vector<int>& nums){ //used访问标记数组,nums是全部元素
if(temp.size() == nums.size()){ //边界条件:一个排列构造完毕
res.push_back(temp);
return;
}
for(int i = 0;i < nums.size();i ++){
if(i > 0 && nums[i] == nums[i-1] && used[i-1] == 0) continue; //去重,同一个位置的元素不被用多次
if(used[i] != 0) continue; //nums[i]已经被选择过
else{
temp.push_back(nums[i]); //nums[i]填入当前位置
used[i] = 1;
dfs(used,nums);
temp.pop_back(); //不选择nums[i]填入当前位置
used[i] = 0;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums){ //nums存储全部元素
vector<int> used(nums.size(),0); //访问标记数组
sort(nums.begin(),nums.end()); //排序
dfs(used,nums); //深搜起点
return res;
}
};
到这里,我们也算是把这类问题都行成了这样的模板。
运行结果: