力扣刷题46. 全排列
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);
}
}
}
}