回溯解法思路:
1.先写一个集合来接收全部的全排列,再写一个集合来接受单个的全排列。在声明一个int【】数组来用于去重用的标记nums数组中什么元素用了的标记。同时排列一下nums数组方便去除重复的全排列。
2.调用回溯函数,终止条件为li2集合的长度等于nums.length,相当于遍历到了结尾,同时要注意相同的数字造成的重复的全排列,所以要去重。在遍历过程中假如Index【i】值为0就表示没有使用该nums【i】的值,使用的nums【i】值的Index【i】值为1。之后进行递归和回溯操作来遍历全部的全排列。
class Solution {//接收全部的全排列List<List<Integer>> li1=new ArrayList<>();//接收单个全排列List<Integer> li2=new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {//用于去重用的标记nums数组中什么元素用了的标记int[] Index=new int[nums.length];//排列一下nums数组方便去除重复的全排列Arrays.sort(nums);//调用回溯函数huisu(nums,Index);return li1;}//回溯函数public void huisu(int[] nums,int[] Index){//终止条件if(li2.size()==nums.length){li1.add(new ArrayList<>(li2));return ;}//遍历全部的全排列for(int i=0;i<nums.length;i++){//去重相同的数字造成的重复的全排列if(i>0&&nums[i]==nums[i-1] && Index[i-1]==0){continue;}//假如Index【i】没有用,就进行向下寻找全排列if(Index[i]==0){//同时要把Index【i】标记为已使用Index[i]=1;//把元素添加到集合li2中li2.add(nums[i]);//递归继续寻找huisu(nums,Index);//回溯节点,寻找其他节点Index[i]=0;li2.removeLast();}}}
}