全排列Ⅱ
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
class Solution {
public:
vector<vector<int>>res;// 保存所有情况
vector<vector<int>>permuteUnique(vector<int>& nums) {
vector<bool> nums1(nums.size(),true);
vector<int>current;//当前保存的结果
vector<int>used;
trace_back(nums,current,nums1,used);
return res;
}
void trace_back(const vector<int>& nums,vector<int> ¤t,vector<bool>&num_flag,vector<int>&used)
{
//判断是否已经生成一个结果
if(current.size()==nums.size())
{
res.push_back(current);//保存在结果中
return;
}
else
{
for(int i=0;i<nums.size();i++)
{
auto it=find(used.begin(), used.end(), nums[i]);
if(num_flag[i]&&it==used.end())//判断节点有咩有使用过
{
used.push_back(nums[i]);//把使用过得节点放入,用作重复判断
current.push_back(nums[i]);
num_flag[i]=false;//使用过该节点 所以判断为false
vector<int>use;//到子节点得时候重新建立 相关重复判断use
trace_back(nums,current,num_flag,use);//开始往子节点走
//恢复状态
current.pop_back();
num_flag[i]=true;
}
}
}
}
};

浙公网安备 33010602011771号