给你一个包含重复数字的集合,要求返回所有唯一的排列数。
1. 回溯法
public List<List<Integer>> permuteUnique(int[] nums)
{
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList,
int[] nums, boolean[] used)
{
if (tempList.size() == nums.length)
{
list.add(new ArrayList<>(tempList));
}
else
{
for (int i=0; i<nums.length; i++)
{
// 当前元素被使用着或者当前元素和前一个元素相同且都没被使用,就跳过
if (used[i] || i > 0 && nums[i] == nums[i-1] && !used[i-1])
continue;
used[i] = true; // 正在使用
tempList.add(nums[i]);
backtrack(list, tempList, nums, used);
used[i] = false; // 置位(移除tempList)
tempList.remove(tempList.size()-1);
}
}
}