46. 全排列
题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
使用回溯算法,深度优先遍历+状态重置
实现
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new LinkedList<>(); //结果变量
if (nums == null || nums.length == 0) {
return res;
}
boolean[] used = new boolean[nums.length]; //表示nums中的每位数字是否已经使用
Arrays.fill(used, false); //全部数字都没有使用
List<Integer> sub = new LinkedList<>(); //每一种组合
generate(nums, res, sub, used);
return res;
}
/**
* 生成全排列
*
* @param nums 全排列的数字
* @param res 结果变量
* @param sub 每一种组合
* @param used 对应nums中的每位数字是否已经使用
*/
private void generate(int[] nums, List<List<Integer>> res, List<Integer> sub, boolean[] used) {
/*如果是一种组合了,就是没有可用的数字了*/
if (nums.length == sub.size()) {
res.add(new LinkedList(sub));
return;
}
for (int i = 0; i < nums.length; i++) {
// 如果这一位数字已经使用了
if (used[i] == true) {
continue;
}
used[i] = true; //标明这个数字已经使用了
sub.add(nums[i]);
generate(nums, res, sub, used);
sub.remove(sub.size() - 1);
used[i] = false; //标明这个数字没有使用
}
}
}