46. 全排列

描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

46. 全排列

链接

46. 全排列 - 力扣(LeetCode) (leetcode-cn.com)

解法一

 1 class Solution {
 2 
 3     List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
 4     LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
 5     boolean[] used;
 6     public List<List<Integer>> permute(int[] nums) {
 7         if (nums.length == 0){
 8             return result;
 9         }
10         used = new boolean[nums.length];
11         permuteHelper(nums);
12         return result;
13     }
14 
15     private void permuteHelper(int[] nums){
16         if (path.size() == nums.length){
17             result.add(new ArrayList<>(path));
18             return;
19         }
20         for (int i = 0; i < nums.length; i++){
21             if (used[i]){
22                 continue;
23             }
24             used[i] = true;
25             path.add(nums[i]);
26             permuteHelper(nums);
27             path.removeLast();
28             used[i] = false;
29         }
30     }
31 }

 

解法二

 1 // 解法2:通过判断path中是否存在数字,排除已经选择的数字
 2 class Solution {
 3     List<List<Integer>> result = new ArrayList<>();
 4     LinkedList<Integer> path = new LinkedList<>();
 5     public List<List<Integer>> permute(int[] nums) {
 6         if (nums.length == 0) return result;
 7         backtrack(nums, path);
 8         return result;
 9     }
10     public void backtrack(int[] nums, LinkedList<Integer> path) {
11         if (path.size() == nums.length) {
12             result.add(new ArrayList<>(path));
13         }
14         for (int i =0; i < nums.length; i++) {
15             // 如果path中已有,则跳过
16             if (path.contains(nums[i])) {
17                 continue;
18             } 
19             path.add(nums[i]);
20             backtrack(nums, path);
21             path.removeLast();
22         }
23     }
24 }

 

参考

carl

上一篇:algs4 1.3.46栈可生成性问题中禁止出现的排列


下一篇:【算法】剑指 Offer 46. 把数字翻译成字符串