leetcode 46 全排列

题目:给定一组数,给出所有可能的全排列(次序无所谓)。

 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. 把添加过的元素交换到数组前端。

猜你喜欢

转载自www.cnblogs.com/hiyashinsu/p/10714669.html