题目描述: 给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
根据题目意思,序列中包含重复数字,但是返回所有不重复的全排列。
先参考全排列
由于今天有其他事情需要做,就不总结了可以参考大佬写的回溯加剪枝
java语言实现
class Solution {
List<List<Integer>> res = new LinkedList<>();
/* 主函数,输入一组不重复的数字,返回它们的全排列 */
List<List<Integer>> permuteUnique(int[] nums) {
// 记录「路径」
LinkedList<Integer> track = new LinkedList<>();
int len = nums.length;
boolean[] used = new boolean[len];
backtrack(nums, track,used);
return res;
}
// 路径:记录在 track 中
// 选择列表:nums 中不存在于 track 的那些元素
// 结束条件:nums 中的元素全都在 track 中出现
void backtrack(int[] nums, LinkedList<Integer> track,boolean [] used) {
// 触发结束条件
Arrays.sort(nums);
if (track.size() == nums.length) {
res.add(new LinkedList(track));
return;
}
for (int i = 0; i < nums.length; i++) {
// 排除不合法的选择
if(i>0&&nums[i]==nums[i-1]&&!used[i-1])
continue;
if (!used[i]){
// 做选择
track.add(nums[i]);
used[i]=true;
// 进入下一层决策树
backtrack(nums, track,used);
used[i]=false;
// 取消选择
track.removeLast();
}
}
}
}