给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
提示:
- 1 <= nums.length <= 8
- -10 <= nums[i] <= 10
-
class Solution { List- > res = new ArrayList<>();
LinkedList
path = new LinkedList<>(); public List - > permuteUnique(int[] nums) {
//排序,使相同的数字放在一起
Arrays.sort(nums);
boolean[] used = new boolean[nums.length];
recuit(nums,nums.length,used);
return res;
}
public void recuit(int[] nums,int n,boolean[] used){
if(path.size() == n){
res.add(new LinkedList
(path)); return; } for(int i = 0;i < nums.length;i++){ if(used[i]){ continue; } //剪枝,当前元素如果和前一个元素相等,并且前一个元素已经被使用 if(i > 0 && nums[i] == nums[i-1] && !used[i-1]){ continue; } path.add(nums[i]); used[i] = true; recuit(nums,n,used); path.removeLast(); used[i] = false; } } }



