思路是用一个Boolean array来保存每个元素用过的记录,如果用过,则跳过。
处理重复数的时候,先sort,然后如果前一个元素等于后一个元素而且前一个元素已经用过,则跳过后一个元素
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List res = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0) return res;
boolean[] used = new boolean[nums.length];
List<Integer> pre = new ArrayList<Integer>();
Arrays.sort(nums);
helper(nums, used, pre, res);
return res;
}
private void helper (int nums[], boolean[] used, List<Integer> pre, List<List<Integer>> res) {
if (pre.size() == nums.length) {
res.add(new ArrayList<Integer>(pre));
return;
}
for (int i = 0; i < nums.length; i++) {
if (used[i]) continue;
if (i > 0 && nums[i - 1] == nums[i] && !used[i - 1]) continue;
used[i]=true;
pre.add(nums[i]);
helper(nums, used, pre, res);
used[i]=false;
pre.remove(pre.size() - 1);
}
return;
}
}