image.png
全排列问题

思路

使用回溯来解决
image.png

第一步是从这三个元素中抽出一个元素,接下来递归求解,继续在其中抽出一个元素

image.png
依次可得
image.png
使用回溯法来解决问题
image.png

code

  1. class Solution {
  2. private List<List<Integer>> res = new ArrayList<>();
  3. private boolean[] used; //判断是否使用过
  4. // p中保存了一个有index-1个元素的排列。
  5. // 向这个排列的末尾添加第index个元素, 获得一个有index个元素的排列
  6. private void generatePermutation(int[] nums,int index,LinkedList<Integer> p){
  7. //如果包含了所有的元素 则将结果加入res
  8. if(index == nums.length){
  9. res.add((LinkedList<Integer>)p.clone());
  10. return;
  11. }
  12. //遍历数组 找到需要添加的index元素
  13. for(int i=0;i<nums.length;i++){
  14. if(!used[i]){ //如果没有使用过
  15. p.addLast(nums[i]); //加入队尾
  16. used[i]=true; //设定使用
  17. generatePermutation(nums,index+1,p); //递归调用 index+1
  18. p.removeLast(); //回溯之后将之前的元素出队
  19. used[i]=false; //设定没有访问过
  20. }
  21. }
  22. }
  23. public List<List<Integer>> permute(int[] nums) {
  24. if(nums.length==0)
  25. return res;
  26. used = new boolean[nums.length];
  27. //从index0开始
  28. generatePermutation(nums,0,new LinkedList<>());
  29. return res;
  30. }
  31. }