给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [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<Integer> output = new ArrayList<Integer>();
// 用于存放多个不同排序组合的数组
List<List<Integer>> res = new ArrayList<List<Integer>>();
int length = nums.length;
for (int num : nums) {
output.add(num);
}
backtrack(length, output, res, 0);
return res;
}
private void backtrack(int length, List<Integer> output, List<List<Integer>> res, int first) {
// 这里主要采用递归方式不断构造不同排序组合数组,然后存放到res里
// first表示被交换的元素,比如 1 2 3,first = 0时表示1这个位置将分别与1、2、3交换,即123、213、321
// 每次交换都需要复原防止下次进行交换时出现一样组合的数组
if (length == first) {
res.add(new ArrayList<Integer>(output));
}
for (int i = first; i < length; i++) {
Collections.swap(output, first, i);
backtrack(length, output, res, first + 1);
Collections.swap(output, first, i);
}
}
}