美文网首页
全排列算法

全排列算法

作者: PENG先森_晓宇 | 来源:发表于2023-03-12 22:31 被阅读0次

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

算法如下:

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> ret = new ArrayList<>();
        List<Integer> target = new ArrayList<>();
        for (int num:nums){
            target.add(num);
        }
        trance(ret,0,nums.length,target);
        return ret;
    }
    public void trance(List<List<Integer>> ret,int cursor,int length,List<Integer> target){
        if(cursor == length-1){
            //这里要注意:要重新实例化一个ArrayList,因为target是一个引用地址
            ret.add(new ArrayList<Integer>(target));
            return;
        }
        //这里的思想很重要,以cursor下标为点,依次和cursor后面的下标交换,这样就会得出cursor下标不同值的n个数组,
        //cursor下标排完之后,在以cursor+1下标为准,一次进行上述操作,当cursor为length-1时则全部遍历完了,依次
        //添加进数组即可。
        for (int i = cursor;i<length;i++){
            Collections.swap(target,cursor,i);
            trance(ret,cursor+1,length,target);
            Collections.swap(target,cursor,i);
        }
    }
}

这个算法有俩个疑问点:

  • 为什么cursor == length-1时才需要添加add呢?看下图的递归树就明白了
  • 为什么 Collections.swap(target,cursor,i)之后还需要 Collections.swap(target,cursor,i)呢?
    举个例子,原数组1,2,3 当游标为0时的意思是后面的元素2和3都和1元素置换。
    当第一次置换之后为2 ,1,3,此时我们需要将2,1,3还原成1,2,3之后才能继续和3置换成3,2,1,如果不还原成1,2,3直接置换之后的结果为3,1,2了

相关文章

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 全排列算法

    参考资料 先上代码,实现非常简洁 输出 主要思路 在此树中,每一个从树根到叶子节点的路径,就对应了集合A的一个排列...

  • 全排列算法

    4个数的全排列 结果 任务分配问题

  • 全排列算法

    问题: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,...

  • 全排列算法

    题目:给定元素a,b,a,b,c,c,d,求解出所有的排列。思路:首先这道题的算法是一个比较经典的算法,它并不是使...

  • 全排列算法

    代码实现 参考资料 全排列算法 - bilibili.com

  • 全排列算法

    问题描述: 对于一个给定的序列 a = [a1, a2, a3, … , an],请设计一个算法,用于输出这个序列...

  • 全排列算法

    全排列的定义见全排列.这里我们详细讲一下交换法和字典序法 交换法 举个简单的例子,假设我们要对1234进行全排列1...

  • 全排列算法

    1、问题描述:给定一个字符串,输出该字符串所有排列的可能。如输入“abc”,输出“abc,acb,bca,bac,...

网友评论

      本文标题:全排列算法

      本文链接:https://www.haomeiwen.com/subject/eyvqrdtx.html