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,那么就满足直接跳过的请求