解法:定好第一位(递归)
每个元素都可以作为第一个元素,当它作为第一个元素时,其他元素进行全排列,再把他们拼起来
而数组不是很好操作,可以先转为列表,这样在删除某个元素的时候不需要移动数组后面的元素
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();

京公网安备 11010502036488号