Skip to main content

Permutations II

Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.

public IList<IList<int>> PermuteUnique(int[] nums)
{
IList<IList<int>> result = new List<IList<int>>();
Array.Sort(nums);
bool[] used = new bool[nums.Length];
List<int> temp = new List<int>();
PermuteUnique(nums, temp, result, used);
return result;
}

public void PermuteUnique(int[] nums, List<int> temp, IList<IList<int>> result, bool[] used)
{
if (temp.Count == nums.Length)
{
result.Add(temp.ToList());
return;
}
for (int i = 0; i < nums.Length; i++)
{
if (used[i] || (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])) continue;
temp.Add(nums[i]);
used[i] = true;
PermuteUnique(nums, temp, result, used);
temp.RemoveAt(temp.Count - 1);
used[i] = false;
}
}