LeetCode 46 Permutations
2016-06-01 15:44
567 查看
Given a collection of distinct numbers, return all possible permutations.
For example,
the following permutations:
and
方法一:逐渐生成前i个数的排列组合,然后把num[i+1]见缝插针,再组装成新的排列组合。见代码和打印结果。
tmp result = [[0]]
tmp result = [[1, 0], [0, 1]]
tmp result = [[2, 1, 0], [2, 0, 1], [1, 2, 0], [0, 2, 1], [1, 0, 2], [0, 1, 2]]
tmp result = [[3, 2, 1, 0], [3, 2, 0, 1], [3, 1, 2, 0], [3, 0, 2, 1], [3, 1, 0, 2], [3, 0, 1, 2], [2, 3, 1, 0], [2, 3, 0, 1], [1, 3, 2, 0], [0, 3, 2, 1], [1, 3, 0, 2], [0, 3, 1, 2], [2, 1, 3, 0], [2, 0, 3, 1], [1, 2, 3, 0], [0, 2, 3, 1], [1, 0, 3, 2], [0, 1,
3, 2], [2, 1, 0, 3], [2, 0, 1, 3], [1, 2, 0, 3], [0, 2, 1, 3], [1, 0, 2, 3], [0, 1, 2, 3]]
方法二:递归回溯.
It could be solved using modified DFS. Each time insert one element that has not been inserted yet.
The idea it so start with empty set. Each time , one number is introduced, for each existing solution, insert this number to all possible positions.
For example,
[1,2,3]have
the following permutations:
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
and
[3,2,1].
方法一:逐渐生成前i个数的排列组合,然后把num[i+1]见缝插针,再组装成新的排列组合。见代码和打印结果。
public static List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<>(); result.add(new ArrayList<Integer>()); for (int i = 0; i < nums.length; i++) { List<List<Integer>> newRes = new ArrayList<>(); for (int j = 0; j <= i; j++) for (List<Integer> k : result) { List<Integer> list = new ArrayList<>(k); list.add(j, nums[i]); newRes.add(list); } result = newRes; System.out.println("tmp result = "+result); } return result; }根据代码中的
System.out.println("tmp result = "+result);nums = [0, 1, 2, 3]的打印结果:
tmp result = [[0]]
tmp result = [[1, 0], [0, 1]]
tmp result = [[2, 1, 0], [2, 0, 1], [1, 2, 0], [0, 2, 1], [1, 0, 2], [0, 1, 2]]
tmp result = [[3, 2, 1, 0], [3, 2, 0, 1], [3, 1, 2, 0], [3, 0, 2, 1], [3, 1, 0, 2], [3, 0, 1, 2], [2, 3, 1, 0], [2, 3, 0, 1], [1, 3, 2, 0], [0, 3, 2, 1], [1, 3, 0, 2], [0, 3, 1, 2], [2, 1, 3, 0], [2, 0, 3, 1], [1, 2, 3, 0], [0, 2, 3, 1], [1, 0, 3, 2], [0, 1,
3, 2], [2, 1, 0, 3], [2, 0, 1, 3], [1, 2, 0, 3], [0, 2, 1, 3], [1, 0, 2, 3], [0, 1, 2, 3]]
方法二:递归回溯.
It could be solved using modified DFS. Each time insert one element that has not been inserted yet.
The idea it so start with empty set. Each time , one number is introduced, for each existing solution, insert this number to all possible positions.
public static List<List<Integer>> permute2(int[] nums) { List<List<Integer>> result = new ArrayList<>(); backtrack(result, new ArrayList<Integer>(), nums); return result; } private static void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums) { if (tempList.size() == nums.length) { result.add(new ArrayList<>(tempList)); } else { for (int i = 0; i < nums.length; i++) { if (tempList.contains(nums[i])) continue; // element already exists, skip tempList.add(nums[i]); backtrack(result, tempList, nums); tempList.remove(tempList.size() - 1); } } }方法三:对数组数据不断进行交换,这个方式最快
public List<List<Integer>> permute3(int[] nums) { List<List<Integer>> result = new ArrayList<>(); perm(result, nums, 0); return result; } public void perm(List<List<Integer>> result, int[] nums, int pos) { if(pos == nums.length) { List<Integer> list = new ArrayList<Integer>(); for(int a:nums) list.add(a); result.add(list); return; } for(int i=pos; i<nums.length; i++) { swap(nums, i, pos); perm(result, nums, pos+1); swap(nums, i, pos); } } private void swap(int[] nums, int i, int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解