ToB企服应用市场:ToB评测及商务社交产业平台

标题: LeetCode46全排列(回溯入门) [打印本页]

作者: 宁睿    时间: 2023-9-3 07:48
标题: LeetCode46全排列(回溯入门)
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
题目描述

  1. 输入:nums = [1,2,3]
  2. 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
复制代码
  1. 输入:nums = [0,1]
  2. 输出:[[0,1],[1,0]]
复制代码
  1. 输入:nums = [1]
  2. 输出:[[1]]
复制代码
个人回溯和46题的理解


解题思路


编码

  1. public class L0046 {
  2.     List<List<Integer>> res = new ArrayList<>();
  3.     public List<List<Integer>> permute(int[] nums) {
  4.         // 回溯过程中的重要辅助参数:标记nums数组中有哪些已经使用过
  5.         boolean[] used = new boolean[nums.length];
  6.         // 回溯过程中的重要辅助参数:路径
  7.         int[] path = new int[nums.length];
  8.         dfs(nums, used, path, 0);
  9.         return res;
  10.     }
  11.     public void dfs(int[] nums, boolean[] used, int[] path, int depth) {
  12.         // 终止条件(深度达到)
  13.         // 搜集:栈入res
  14.         // 本题的终止条件是一次组合的长度达到数组长度
  15.         if (depth==nums.length) {
  16.             // 搜集结果
  17.             // 千万注意:这个path一直在使用中,所以不能把path放入res中,而是path的元素
  18. //            res.add(Arrays.stream(path).boxed().collect(Collectors.toList()));
  19.             List<Integer> list = new ArrayList<>();
  20.             for(int val : path) {
  21.                 list.add(val);
  22.             }
  23.             res.add(list);
  24.             return;
  25.         }
  26.         // for循环
  27.         for (int i=0;i<nums.length;i++) {
  28.             // 如果当前数字没有用到,就标记,进入path,再做dfs
  29.             if (!used[i]) {
  30.                 used[i] = true;
  31.                 // 注意,path的下标千万不要用i!
  32.                 // 例如1和2的全排列,在制造[2,1]的时候,i=1,但此时要修改的是path[i],
  33.                 // 所以path的下标应该是depth
  34.                 path[depth] = nums[i];
  35.                 // 一次递归,深度要加一
  36.                 dfs(nums, used, path, depth+1);
  37.                 used[i] = false;
  38.             }
  39.         }
  40.     }
  41.     public static void main(String[] args) {
  42.         List<List<Integer>> list = new L0046().permute(new int[] {1,2,3});
  43.         list.forEach(one -> {
  44.            Tools.printOneLine(one);
  45.         });
  46.     }
  47. }
复制代码

执行结果


欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4