题目
截图自官方
代码
class Solution {
// 回溯的经典常规题目
// “维持状态,重置状态”。一般都是深度优先,遍历树,见官方视频题解。
// 本题中状态为pos:树的层数,flags表示当前元素是否访问过。
List<List<Integer>> ans=new ArrayList();
List<Integer> cur=new ArrayList();
public List<List<Integer>> permute(int[] nums) {
int n=nums.length;
if(n==0){
return ans;
}
boolean[] flags=new boolean[n];
dfs(0,nums,flags);
return ans;
}
public void dfs(int pos,int[] nums,boolean[] flags){
if(pos==nums.length){
ans.add(new ArrayList<Integer>(cur));
return;
}
// for循环内部递归实现深度优先遍历。先到叶子,往上一层层回溯。
for(int i=0;i<nums.length;i++){
if(flags[i]){
continue;
}
cur.add(nums[i]);
flags[i]=true;
dfs(pos+1,nums,flags);
//重置状态
flags[i]=false;
cur.remove(cur.size()-1);
}
}
}