难度中等223
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
思路:和全排列差不多,要排序+剪枝,懒得写了给个题解网址。
class Solution {
int[] visited;//标记数组
List<List<Integer>> res = new ArrayList<>();//答案
public List<List<Integer>> permuteUnique(int[] nums) {
//修改1:排序
Arrays.sort(nums);
visited = new int[nums.length];
backtrack(nums, new ArrayList<Integer>());
return res;
}
private void backtrack(int[] nums, ArrayList<Integer> tmp) {
if (tmp.size() == nums.length) {
res.add(new ArrayList<>(tmp));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 1) continue;
//修改2:剪枝,
if (i > 0 && nums[i - 1] == nums[i] && visited[i - 1]==0) {
continue;
}
visited[i] = 1;
tmp.add(nums[i]);
backtrack(nums, tmp);
visited[i] = 0;
tmp.remove(tmp.size() - 1);
}
}
}