问题描述:给你的那个一个不好喊重复数字的数组nums,返回其所有可能的全排列,你可以按照任何顺序返回答案;
回溯算法求解:定义一个used数组用来表征数组nums是否被选择,每一个回溯函数都要经过nums.length个循环,每次选择一个元素,如果没有使用过,则标记其已经使用过,并进入下一个回溯算法中,当这个回溯算法退出时,修改当前元素为未使用过,并删除当前元素。进入下一个循环中
public void traceBack(int nums[],int used[],List<Integer>templist,List<List<Integer>>res)
{
if(templist.size()==nums.length)
{
res.add(new ArrayList<Integer>(templist));
return;
}
for(int i=0;i<nums.length;i++)
{
if(used[i]==false)
{
used[i]==true;
traceback(nums,used,templist.add(nums[i]));
used[i]=false;
templist.remove(templist.size()-1);
}else
{
continue;
}
}
}
public ArrayList<ArrayList<Integer>> TranceBack(int [] nums)
{
ArrayList<ArrayList<Integer>> list=new ArrayList<>();
int [] used=new int[nums.length];
for(int i=0;i<nums.length;i++)
{
used[i]=false;
}
tranceBack(nums,used,list,new ArrayList<Integer>());
return list;
}