给定一个整数集合,给出这些整数的全排列。
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
代码(用一个标志数组标明是否被访问过):
class Solution {
public List<List<Integer>> permute(int[] nums) {
int len = nums.length;
boolean[] flags = new boolean[len];
List<Integer> temp = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
if(nums == null) {
return result;
}
DFS(nums, flags, temp, result, len);
return result;
}
private void DFS(int[] nums, boolean[] flags, List<Integer> temp, List<List<Integer>> result, int len) {
if(temp.size() == len){
//注意,不能用result.add(temp),因为这样只能在result创建一个指向temp的指针,
//当后面清空temp时,result中所有的结果也会被清空;
//此外,当result中有多个值时,实际上只是有了多个指向temp的指针。
result.add(new ArrayList<Integer>(temp));
return;
}
for(int i = 0;i < len;i++) {
if(!flags[i]){
temp.add(nums[i]);
flags[i] = true;
DFS(nums, flags, temp, result, len);
flags[i] = false;
temp.remove(temp.size()-1);
}
}
}
}