-
思路一
- 具体的全排列其实就是一个分步的问题,第一步可以选择n个元素,第二步选择剩下n-1个,然后再选择剩下n-2个······ 所以可以通过helper函数来传递剩余可选择的数字(subset),具体的处理方式为遍历subset中每一个元素,然后去除,再调用helper方法,之后再把元素放回
class Solution { List<List<Integer>> result; public List<List<Integer>> permute(int[] nums) { result = new ArrayList<>(); List<Integer> subset = Arrays.stream(nums).boxed().collect(Collectors.toList()); helper(new ArrayList<>(), subset); return result; } private void helper(List<Integer> combination, List<Integer> subset) { if (0 == subset.size()) result.add(new ArrayList<>(combination)); else { subset = new ArrayList<>(subset); for (int i = 0; i < subset.size(); i++) { Integer val = subset.get(0); combination.add(val); subset.remove(val); helper(combination, subset); combination.remove((Integer) val); subset.add(val); } } } }
-
思路二
- 首先我们假设递归函数helper(int index)可以得到数组中索引index及以后所有元素的全排列。
- 那么具体的实现方式为,先交换index和i(index<=i<=nums.length)的元素,然后调用helper(index+1),获取后面的全排列,然后再把元素重新交换回去
- 简而言之,求全排列问题其实可以通过交换数组元素来实现。若数组长度为n,将第一个元素分别与后面每一个元素进行交换,生成n种不同的全排列;再用第二个元素与后面每一个元素进行交换,生成n-1种不同的全排列
class Solution { List<List<Integer>> result; int[] nums; public List<List<Integer>> permute(int[] nums) { result = new ArrayList<>(); this.nums = nums; helper(0); return result; } private void helper(int index) { if (index == nums.length) result.add(Arrays.stream(nums).boxed().collect(Collectors.toList())); else { for (int i = index; i < nums.length; i++) { swap(index, i); helper(index + 1); swap(index, i); } } } private void swap(int m, int n) { int tmp = nums[m]; nums[m] = nums[n]; nums[n] = tmp; } }
04-07
155
