题目
给定一个没有重复数字的集合,请找出它的所有全排列。例如,集合[1,2,3]有6个全排列,分别是[1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]和[3,2,1]。
分析
如果输入的集合中有n个元素,那么生成一个全排列需要n步。当生成排列的第1个数字时会面临n个选项,即n个数字都有可能成为排列的第1个数字。生成排列的第1个数字之后接下来生成第2个数字,此时面临n-1个选项,即剩下的n-1个数字都有可能成为第2个数字。然后以此类推,直到生成最后一个数字,此时只剩下1个数字,也就只有1个选项。看起来解决这个问题可以分成n步,而且每一步都面临若干选项,这是典型的适用回溯法的场景。
解
public class Test {public static void main(String[] args) {int[] nums = {1, 2, 3};List<List<Integer>> result = permute(nums);for (List<Integer> item : result) {System.out.println(item);}}public static List<List<Integer>> permute(int[] nums) {List<List<Integer>> result = new LinkedList<>();helper(nums, 0, result);return result;}public static void helper(int[] nums, int i, List<List<Integer>> result) {if (i == nums.length) {List<Integer> permutation = new LinkedList<>();for (int num : nums) {permutation.add(num);}result.add(permutation);}else {for (int j = i; j < nums.length; j++) {swap(nums, i, j);helper(nums, i + 1, result);swap(nums, i, j);}}}private static void swap(int[] nums, int i, int j) {if (i != j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}