题解 | 没有重复项数字的全排列
没有重复项数字的全排列
https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型一维数组 * @return int整型ArrayList<ArrayList<>> */ ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> permute (int[] num) { // write code here // 用递归的思路实现 LinkedList<Integer> list = new LinkedList<Integer>(); backTrack(list,num); return res; } public void backTrack(LinkedList list,int[]nums){ if (list.size()==nums.length){ res.add(new ArrayList<>(list)); } for(int i = 0;i<nums.length;i++){ if (list.contains(nums[i])){ continue; } list.add(nums[i]); backTrack(list,nums); list.removeLast(); } } }
这是递归解法,这次使用到了LinkedList,LinkedLink和ArrayList 这两种数据结构是类似的,但是LinkedList 像链表一样,插入方便,遍历麻烦、ArrayList相反,还有LinkedList中元素存放是按照插入的顺序的。两者一些方法
ontains7.isEmpty 这些共用的方法,因为他们都实现了set接口1. add 2.get 3.set()替换4.remove 方法5.size 6.c于第一个元素的 removeLast()removeFirst()addLast() addFirst() get2.LinkedList有一些属于链表的方法 主要是针对
Last() getLast()加元素,和回溯来覆盖所有的情况递归解法的思路像深度优先搜索的思路,通过不断的增
下面是迭代解法
import java.util.ArrayList; import java.util.LinkedList; public class Solution { // 存储所有排列结果的列表 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); /** * 生成整数数组的所有排列 * @param num 输入的整数数组 * @return 包含所有排列的列表 */ public ArrayList<ArrayList<Integer>> permute(int[] num) { // 遍历数组中的每个元素 ArrayList<Integer> list = new ArrayList<>(); // 先对res中加入一个空的list,给第一次插入制造一个空间。 res.add(list); System.out.print(res.size()); for (int i = 0; i < num.length; i++) { // 用于临时存储新生成的排列 ArrayList<ArrayList<Integer>> tempList = new ArrayList<>(); // 遍历当前已有的排列 for (ArrayList<Integer> each : res) { // System.out.println(each.size() + 1); // 在当前排列的不同位置插入新元素 for (int k = 0; k < each.size() + 1; k++) { each.add(k, num[i]); //帮我看看这里为啥要先保存到一个temp中然后再加入templist // ArrayList<Integer> temp = new ArrayList<>(each); System.out.print(each); //临时变量不能插入 each是临时变量,所以将其加入templist必须新建一个list tempList.add((ArrayList<Integer>)each.clone()); each.remove(k); } } res = new ArrayList<>(tempList); tempList.clear(); } return res; } }