给一个数组返回其所有可能的排列组合情况。 例如 1,2,3的全排列有 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1
如图,基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然后再排列以2为第一位的情况,重复上述过程将所有可能结果全部放入res中。
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class quanpailie {
public static void main(String args[]){
int[] nums=new int[]{1,2,3};
System.out.println(permute(nums));
}
public static List<List<Integer>> permute(int[] nums) {
//定义一个存储数组
List<List<Integer>> res=new ArrayList<>();
//如果长度为0即全排列为空
if(nums.length==0) return res;
Deque<Integer> path=new ArrayDeque<>();
//定义状态,即判断当前数字是否被排列过 false-未使用,true-已使用
Boolean[] use=new Boolean[nums.length];
for(int i=0;i<nums.length;i++){
use[i]=false;
}
dfs(res,use,path,0,nums,nums.length);
return res;
}
private static void dfs(List<List<Integer>> res, Boolean[] use, Deque<Integer> path, int depth, int[] nums, int length) {
//当深度与长度相等时,即已排列完当前情况,将其放入res中
if(depth==length){
res.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++){
if(use[i]){
continue;
}
path.addLast(nums[i]);
use[i]=true;
dfs(res, use, path, depth+1, nums, length);
//回溯到之前的情况
use[i]=false;
path.removeLast();
}
}
}