给定一个不含重复数字的数组 ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
以[1,2,3]为例子来看,一共有六种可能情况,我需要将几种情况全部列出来,但是为了在中途避免重复的执行相同的代码,在其中加入状态来记录已经计算过的。
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
boolean[] arr = new boolean[nums.length];
List<Integer> path = new ArrayList<>();
process(nums, list, arr, path);
return list;
}
/**
*
* @param nums 要排列的数字的集合
* @param list 返回的结果
* @param arr 用于记录状态
* @param path 记录当前已经被排列的数字
*/
public void process(int[] nums, List<List<Integer>> list, boolean[] arr, List<Integer> path) {
//如果已经被排列的数字的长度为全部的长度,就应该收集起来,进入下一个分支
if (path.size() == nums.length) {
//注意,此处应该传递一个新的数组,如果传入list.add(path),传入的是地址的值。
list.add(new ArrayList<>(path));
} else {
for (int i = 0; i < nums.length; i++) {
if (!arr[i]) {
arr[i] = true;
path.add(nums[i]);
process(nums, list, arr, path);
arr[i] = false;
path.remove(path.size() - 1);
}
}
}
}
}