using System;
using System.Collections.Generic;


class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @return int整型二维数组
     */
    public bool[] visited;
    public List<List<int>> ans=new List<List<int>>();
    public List<List<int>> permuteUnique (List<int> num) {
        // write code here
        visited=new bool[num.Count];
        num.Sort();
        func(num,new List<int>());
        return ans;
    }
    
    public void func(List<int> num,List<int> vec){
        if(vec.Count==num.Count)
        {
            ans.Add(new List<int>(vec));
            return;
        }
        for(int i=0;i<num.Count;i++)
        {
            if(visited[i])
                continue;
            if(i>0 && num[i]==num[i-1] && !visited[i-1])
                continue;
            vec.Add(num[i]);
            visited[i]=true;
            //继续寻找下一i个数
            func(num,vec);
            //将上次全排列的结果在,最后一个数移除掉
            vec.RemoveAt(vec.Count-1);   
            //移除掉的数字设为未访问
            visited[i]=false;
                                      
            
        }
    }
}


建议先做
建议先做,不包含重复版的,然后在理解本问题。两个关键点
1.要对数组进行排序
2.for循环中如何避免两个数字有重复,比如 1 1 2,第一个1 正常遍历,遍历第二个1时,发现和前面的数字相等,且前面的1标记为false,那么就满足直接跳过的请求