标准 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;
- }
- }