46. Permutations
题目:
Given a collection of numbers, return all possible permutations.
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]
.
Backtracking
链接: http://leetcode.com/problems/permutations/
4/15/2017
6ms, 78%
按照之前backtracking的公式往上套,怎么都不对,忽然想起来这个permutation可能并不一样。
combination之类的在意的主要是元素,而permutation更在意元素+顺序。所以在进入recursive之前就要让list里有所有元素,然后在recursive function中进行swap
注意第6,7行,第18,20行,这个与下面算法班的写法不同。
再看一遍别人的答案,其实temp也可以不需要,直接在nums上进行位置互换就可以了。
1 public class Solution { 2 public List<List<Integer>> permute(int[] nums) { 3 List<List<Integer>> ret = new ArrayList<>(); 4 ArrayList<Integer> temp = new ArrayList<Integer>(); 5 if (nums.length == 0) return ret; 6 for (int i = 0; i < nums.length; i++) { 7 temp.add(nums[i]); 8 } 9 enumerate(nums, ret, temp, 0); 10 return ret; 11 } 12 private void enumerate(int[] nums, List<List<Integer>> ret, ArrayList<Integer> temp, int pos) { 13 if (pos == nums.length) { 14 ret.add(new ArrayList<Integer>(temp)); 15 return; 16 } 17 for (int i = pos; i < nums.length; i++) { 18 exchange(temp, pos, i); 19 enumerate(nums, ret, temp, pos + 1); 20 exchange(temp, i, pos); 21 } 22 } 23 private void exchange(ArrayList<Integer> temp, int i, int j) { 24 int tmp = temp.get(i); 25 temp.set(i, temp.get(j)); 26 temp.set(j, tmp); 27 } 28 }
4/22/2017
算法班
算法班是通过不断判断是否元素已存在,若不存在加入新的值,处理后减去加入的值来做的。注意主函数中并不需要事先把元素都放进去
1 class Solution { 2 /** 3 * @param nums: A list of integers. 4 * @return: A list of permutations. 5 */ 6 public List<List<Integer>> permute(int[] nums) { 7 // write your code here 8 List<List<Integer>> result = new ArrayList<>(); 9 List<Integer> list = new ArrayList<>(); 10 11 if (nums == null || nums.length == 0) { 12 result.add(list); 13 return result; 14 } 15 16 search(nums, list, result); 17 return result; 18 } 19 20 public void search( int[] nums, 21 List<Integer> list, 22 List<List<Integer>> result) { 23 24 if (list.size() == nums.length) { 25 result.add(new ArrayList(list)); 26 } 27 28 for (int i = 0; i < nums.length; i++) { 29 if (list.contains(nums[i])) { 30 continue; 31 } 32 list.add(nums[i]); 33 search(nums, list, result); 34 list.remove(list.size() - 1); 35 } 36 37 return; 38 } 39 }
参考的是:
https://www.cs.princeton.edu/courses/archive/fall12/cos226/lectures/67CombinatorialSearch.pdf
别人的一个总结,但是我并不觉得总结得很好
另外一个别人的算法,用的是iterative,但是我不准备研究了
https://discuss.leetcode.com/topic/6377/my-ac-simple-iterative-java-python-solution
更多讨论:
https://discuss.leetcode.com/category/54/permutations
以及各种方法总结,值得看看next permutation