题目描述
给定一个不含重复数字的数组
nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例1
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例2
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例3
输入:nums = [1] 输出:[[1]]
做题思路
本题是寻求所有解的典型问题,因此使用回溯来求解。
- 每层都是从0开始搜索
- 需要used数组记录combination中存放了哪些元素
代码
class Solution {
List<List<Integer>> res=new ArrayList<>(); //存放全部排列
LinkedList<Integer> combination=new LinkedList<>(); //存放某个排列
boolean[] used; //标记数组中的某个数是否被用过
public List<List<Integer>> permute(int[] nums) {
if(nums.length==0) return res;
used=new boolean[nums.length]; //初始化
backtrack(nums); //回溯
return res;
}
public void backtrack(int[] nums){
//回溯结束条件
if(combination.size()==nums.length){
res.add(new ArrayList<>(combination));
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue; //若数组中的数被标记过则退出本次循环进入下一次循环
used[i]=true; //标记本次遍历的数
combination.add(nums[i]);
backtrack(nums);
combination.removeLast(); //撤销
used[i]=false; //取消标记
}
}
}