难度中等1740
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 来源:力扣(LeetCode)
思路:本题可以用DFS来解决,先将题目转化成一颗树,在用递归和回溯实现它,如下图(例一 123):
在每一层我们需要遍历还数组中剩下的能够选择的数字并添加入数组。问题是如何能够保证在每一层递归中不选到上一层已经被选择的数字,我们可以通过申请一个数组来对已经选过的数字进行标记。具体细节写在了如下代码注释中:
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
int[] visited; //标记数组
public List<List<Integer>> permute(int[] nums) {
visited = new int[nums.length];
backtrack(nums);
return ans;
}
public void backtrack(int[] nums) {
//递归终止条件
if(temp.size() == nums.length){
ans.add(new ArrayList(temp));
return;
}
//递归中每一层要遍历一遍数组
for(int j = 0; j < nums.length; j++){
//如果该点已经被标记过就continue
if(visited[j] == 1) continue;
//执行操作,将该点的值放入数组,并标记为1
temp.add(nums[j]);
visited[j] = 1;
//进入下一层递归
backtrack(nums);
//回溯,撤销操作
temp.remove(temp.size() - 1);
visited[j] = 0;
}
}
}