解法:定好第一位(递归)
每个元素都可以作为第一个元素,当它作为第一个元素时,其他元素进行全排列,再把他们拼起来
而数组不是很好操作,可以先转为列表,这样在删除某个元素的时候不需要移动数组后面的元素
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> permute(int[] num) { ArrayList<Integer> allElements = toArrayList(num); return permute(allElements); } private ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> elements) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); if (elements.size() == 0) { return result; } if (elements.size() == 1) { ArrayList<Integer> element = new ArrayList<Integer>(elements); result.add(element); return result; } for (int index = 0; index < elements.size(); index++) { int currentElement = elements.get(index); ArrayList<Integer> excludeCurrent = new ArrayList<Integer>(elements); excludeCurrent.remove(index); ArrayList<ArrayList<Integer>> permuteFromNext = permute(excludeCurrent); for(int i = 0; i < permuteFromNext.size(); i++){ ArrayList<Integer> current = new ArrayList<Integer>(elements.size()); current.add(currentElement); current.addAll(permuteFromNext.get(i)); result.add(current); } } return result; } private ArrayList<Integer> toArrayList(int[] num) { ArrayList<Integer> allElements = new ArrayList<Integer>(num.length); for (int i = 0; i < num.length; i++) { allElements.add(num[i]); } return allElements; } }
解法2:选择撤销-递归
import java.util.*; public class Solution { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> permute(int[] num) { LinkedList<Integer> resultItem = new LinkedList<Integer>(); permute(resultItem, num); return result; } private ArrayList<ArrayList<Integer>> permute(LinkedList<Integer> resultItem, int[] num) { if (resultItem.size() == num.length) { result.add(new ArrayList<Integer>(resultItem)); } for (int index = 0; index < num.length; index++) { int currentElement = num[index]; if (resultItem.contains(currentElement)) { continue; } resultItem.add(num[index]); permute(resultItem, num); resultItem.removeLast(); } return result; } }
注意:在撤销的时候,不要用remove(currentElement),因为元素本身是int类型,会被当成是index;
比如当列表只有两个元素【1, 3】时,如果remove(num[2]), 不会移除元素3,而是移除下标为3的元素,而数组的size是2,因此会产生数组越界
应该使用:
resultItem.remove(resultItem.indexOf(currentElement));
或者:
resultItem.removeLast();