思路
本体是在 46题全排列 的基础上,加入了去重的操作,因为会有重复数字的出现,所以要避免例如:111、222、122
这样的情况出现。我们使用了一个boolean类型的数组来进行去重操作,记录数组中的数字是否使用过,如果使用过,则不再使用。
代码实现(java)
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> track = new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
boolean[] used = new boolean[nums.length];
Arrays.fill(used, false);
Arrays.sort(nums);
backTrack(nums, used);
return res;
}
public void backTrack(int[] nums, boolean[] used) {
if (track.size() == nums.length) {
res.add(new ArrayList<>(track));
return;
}
// 去重
for (int i = 0; i < nums.length; i++) {
// used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过
// 如果同⼀树层nums[i - 1]使⽤过则直接跳过
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
continue;
}
if (used[i] == false) {
track.add(nums[i]);
used[i] = true;
backTrack(nums, used);
used[i] = false;
track.remove(track.size() - 1);
}
}
}
}