46. 全排列 - 力扣(LeetCode)
使用dfs搜索,查找所有的情况,首先定义所有的链表集合list,在定义每一种情况的链表res,在主函数中遍历所有的初始元素,首先初始化res,并且添加到res中,进行深搜
在dfs中,首先判断res的长度是否等于给定数组的长度,如果相等的话,把这个链表添加入list,切记,这里添加不要直接添加,需要重新new一个链表 ,再把这个这个新的链表加入list,在 Java 中,对象类型变量在传参的过程中,复制的是变量的地址。这些地址被添加到 res
变量,但实际上指向的是同一块内存地址,所以在结束输出的时候,list中所有的元素都会相等,所以需要这样书写 res.add(new ArrayList<>(res))
,在每一次回溯时,移除res最末尾的元素
package LeetCode;import java.time.Period;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class Q46 {static List<List<Integer>> list;static List<Integer> res;public static void main(String[] args) {int[] nums = {0,1};list = new LinkedList<>();for (int i = 0; i < nums.length; i++) {res = new LinkedList<>();res.add(nums[i]);dfs(nums);}System.out.println(list);}public static void dfs(int[] nums) {if (res.size() == nums.length) {list.add(new LinkedList<>(res));return;}for (int i = 0; i < nums.length; i++) {if (!res.contains(nums[i])) {res.add(nums[i]);dfs(nums);res.remove(res.size()-1);}}}}