47. 全排列 II
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
huisu(nums,result,temp,0);
return result;
}
public void huisu(int[] nums, List<List<Integer>> result, List<Integer> temp, int index){
if(temp.size() == nums.length){
// 记录答案
result.add(new ArrayList<>(temp));
} else {
// 使用位运算符index
for(int i = 0; i < nums.length; ++i){
// 先通过位运算符计算出当前位是0还是1
// 满足条件则代表为0,否则为1
// 只有是0的时候才可以开始操作,否则不可以进行操作
if((index & (1 << (i + 1 - 1))) == 0){
// 如果两个数字相同,那就要判定前一个数字输出了没有,如果没有输出,那我也不能输出。
// 因为这道题就是因为可能出现重复,所以一定要规定出场顺序
if(i > 0 && nums[i - 1] == nums[i]){
if((index & (1 << (i + 1 - 2))) == 0){
continue;
}
}
temp.add(nums[i]);
// 给index对应的位置上加上1
index = index ^ (1 << (i + 1 - 1));
huisu(nums, result, temp, index);
temp.remove(temp.size() - 1);
// 抹去刚刚加上的1
index = index ^ (1 << (i + 1 - 1));
}
}
}
}
}