import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class Solution {
public static void main(String[] args) {
int[] a={1,2,3};
List<List<Integer>> permute = permute(a);
for (List<Integer> integers : permute) {
System.out.println(integers);
}
}
static List<List<Integer>> permute(int[] nums){ //求出数组的全排列
int len= nums.length;
List<List<Integer>> res=new ArrayList<>(); //创建结果集合,用于保存排列的结果
boolean[] used=new boolean[len]; //用于判断数字是否被使用
Deque<Integer> path=new ArrayDeque<>(); //创建栈,用于保存每次遍历临时的结果
dfs(nums,len,0,path,used,res); //从0层即空集开始深度优先遍历
return res;
}
static void dfs(int[] nums, int len, int depth, Deque path,boolean[] used, List<List<Integer>> res) {
if (depth==len){ //如果深度等于数组长度,说明一种排列结果完成
res.add(new ArrayList<>(path)); //将排列结果加入集合中,即path栈中保存的结果 因为栈为引用数据类型,所以new ArrayList 用于将栈中的结果拷贝
return;
}
for (int i = 0; i < len; i++) { //多路分支进行全排列
if (used[i]==true) //如果该数字被选中,则跳过此次选择
continue;
path.addLast(nums[i]); //如果该数字未被选中,尝试将该数字加入path中
used[i]=true; //标记该数字被选中
dfs(nums,len,depth+1,path,used,res); //进行下一层的遍历,即加入下一个数字
path.removeLast(); //递归回溯到此说明下一层遍历结束,将原先加入的数字去除,即恢复原有的状态
used[i]=false; //标记该数字未被选中
}
}
}
力扣46. 全排列
最新推荐文章于 2024-07-15 22:27:18 发布