题意:
思路:
回溯算法
解答:
class Solution {
List<List<Integer>> ListRoot=new ArrayList<>();
List<Integer> list=new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
//if(nums.length==1) return ListRoot.add(nums);
int len=nums.length;//3
int[] vi=new int[len];//默认都是0
DFS(nums,vi,0);
return ListRoot;
}
public void DFS(int[] nums,int[] vi,int n){
if(n==nums.length){
ListRoot.add(new ArrayList<>(list));
//vi=new int[nums.length];
return;
}
for(int i=0;i<nums.length;i++){
if(vi[i]==0){
list.add(nums[i]);
vi[i]=1;
DFS(nums,vi,n+1);
vi[i]=0;
list.remove(list.size()-1);//清理不符合要求的一次
}
}
}
}
关键:
因为要打乱顺序 加入不定的一项,所以对访问过的 进行标记
DFS中的DFS 下面的 vi[0]=0;list.remove
是回溯一次之后,将访问顺序回到0 即下次回溯还可以用,并且清理掉上次的数据(因为当n=length时,已经保存了数组)