全排列Ⅱ

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [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> &current,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;
                 }
             }
         }
    }
};

  

 

posted @ 2020-08-14 14:17  工大教务处  阅读(100)  评论(0编辑  收藏  举报