题解 | 没有重复项数字的全排列

没有重复项数字的全排列

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;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务