MENU

LeetCode46. 全排列

July 10, 2018 • Read: 3206 • LeetCode阅读设置

标准 dfs 问题,只不过这道题有点麻烦在于返回的是一个 List 嵌套 List

声明一些变量,首先是 ans 保存最终结果,其次是 path [],存储当前选取的元素的下标,然后是 boolean v [],保存元素中某个下标的值是否用过,默认值是 false,用过就置为 true

dfs 函数中首先进行边界条件判断,如果到了边界,就将所有保存在 path 中的下标对应的 nums [] 的值赋给一个 List,然后 return。其次 i 从 0 到 nums.length 枚举每一个下标,先进行判断,没有选过才选,将 i 的值给到 path [idx],然后将当前的 v [i] 置为 ture,在进行下一层的 dfs (idx + 1,nums),最后是回溯,将 v [i] 变为 false

  • class Solution {
  • public static List<List<Integer>> ans = new ArrayList<List<Integer>>();
  • public static int[] path = new int[100];
  • public static boolean[] v = new boolean[100];
  • public static void dfs(int idx,int[] nums) {
  • if(idx >= nums.length) {
  • List<Integer> tmp = new ArrayList<Integer>();
  • for(int i = 0;i < nums.length;i++)
  • tmp.add(nums[path[i]]);
  • ans.add(tmp);
  • return;
  • }
  • for(int i = 0;i < nums.length;i++) {
  • if(!v[i]) {
  • path[idx] = i;
  • v[i] = true;
  • dfs(idx + 1,nums);
  • v[i] = false;
  • }
  • }
  • }
  • public List<List<Integer>> permute(int[] nums) {
  • ans.clear();
  • dfs(0,nums);
  • return ans;
  • }
  • }
Last Modified: May 12, 2021
Archives Tip
QR Code for this page
Tipping QR Code