全排列 二 算法
给定一个可包含重复数字的序列 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]]
class PermuteUniqueClass
{
public PermuteUniqueClass()
{
//测试
int[] nums = new int[3] { 1, 1, 3 };
//int[] nums = new int[] { 1 };
IList<IList<int>> resultList = PermuteUnique(nums);
// 输出结果
foreach(var list in resultList)
{
foreach(var v in list)
{
Console.Write(v + " ");
}
Console.WriteLine();
}
}
public IList<IList<int>> PermuteUnique(int[] nums)
{
IList<IList<int>> resultList = new List<IList<int>>();
List<int> pathList = new List<int>();
bool[] used = new bool[nums.Length];
Dfs(nums, 0, pathList, used, resultList);
return resultList;
}
private void Dfs(int[] nums, int depth, List<int> pathList, bool[] used, IList<IList<int>> resultList)
{
if (depth >= nums.Length)
{
resultList.Add(new List<int>(pathList));
return;
}
HashSet<int> hash = new HashSet<int>();
for (int i = 0; i < nums.Length; ++i)
{
if (used[i])
{
continue;
}
if (hash.Contains(nums[i]))
{
continue;
}
hash.Add(nums[i]);
pathList.Add(nums[i]);
used[i] = true;
Dfs(nums, depth + 1, pathList, used, resultList);
pathList.RemoveAt(pathList.Count - 1);
used[i] = false;
}
}
}