题目:给定一组数,给出所有可能的全排列(次序无所谓)。
1 class Solution { 2 private List<List<Integer>> ans = new ArrayList<>(); 3 4 public List<List<Integer>> permute(int[] nums) { 5 ans.clear(); 6 helper(nums, new ArrayList<Integer>(), 0, nums.length); 7 return ans; 8 } 9 10 public void helper(int[] nums, List<Integer> tmp, int k, int n) { 11 if (k == n) { 12 ans.add(new ArrayList<Integer>(tmp)); 13 return; 14 } 15 16 // for (int i = 0; i < n - k; i++) { 17 // tmp.add(nums[i]); 18 // swap(nums, i, n - k - 1); 19 // helper(nums, tmp, k + 1, n); 20 // swap(nums, i, n - k - 1); 21 // tmp.remove(tmp.size() - 1); 22 // } 23 24 for (int i = k; i < n; i++) { 25 tmp.add(nums[i]); 26 swap(nums, i, k); 27 helper(nums, tmp, k + 1, n); 28 swap(nums, i, k); 29 tmp.remove(tmp.size() - 1); 30 } 31 } 32 33 public void swap(int[] nums, int i, int j) { 34 int tmp = nums[i]; 35 nums[i] = nums[j]; 36 nums[j] = tmp; 37 } 38 39 }
非常标准的回溯解法。为了避免重复添加元素,有两种处理方式:
1. 把添加过的元素交换到数组末尾。(如注释部分所示)
2. 把添加过的元素交换到数组前端。